TextViewTest.java revision c02a9f453c5c1255d668bbd8970f4585ab5ff494
1fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/*
2fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Copyright (C) 2008 The Android Open Source Project
3fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
4fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Licensed under the Apache License, Version 2.0 (the "License");
5fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * you may not use this file except in compliance with the License.
6fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * You may obtain a copy of the License at
7fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
8fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *      http://www.apache.org/licenses/LICENSE-2.0
9fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
10fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Unless required by applicable law or agreed to in writing, software
11fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * distributed under the License is distributed on an "AS IS" BASIS,
12fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * See the License for the specific language governing permissions and
14fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * limitations under the License.
15fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
16fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
17fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Supackage android.widget.cts;
18fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
19fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport com.android.cts.stub.R;
20fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport com.android.internal.util.FastMath;
21fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
22fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport org.xmlpull.v1.XmlPullParserException;
23fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
24fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity;
25fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation;
26fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor;
27fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent;
28fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList;
29fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException;
300162547f44173f0604d8a80143c128d9892460a1Kristian Monsenimport android.cts.util.PollingCheck;
31fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
32fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
33fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
34afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path;
35fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
36afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF;
37fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
38fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
41fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
4372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
45fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter;
47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType;
48fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout;
49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection;
50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable;
51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString;
52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
55afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher;
56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
68afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.cts.MockURLSpanTestActivity;
73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
76fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
77afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo;
78fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent;
80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnCreateContextMenuListener;
82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnLongClickListener;
83afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup;
8472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection;
8572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo;
8672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText;
8772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest;
88c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText;
89bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout;
9062808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout;
91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller;
92fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView;
93fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType;
9472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener;
95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
96fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
97fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Supublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewStubActivity> {
102fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
1077375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "the width of the view. New devices have a much larger screen which "
1087375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "actually enables long strings to be displayed with no fading. "
1097375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "I have made this string longer to fix this case. If you are correcting "
1107375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "this text, I would love to see the kind of devices you guys now use!";
111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
11222d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super("com.android.cts.stub", TextViewStubActivity.class);
116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
1224594468cc37000395ee2a000da08651e73e78508keunyoung        new PollingCheck() {
1234594468cc37000395ee2a000da08651e73e78508keunyoung            @Override
1244594468cc37000395ee2a000da08651e73e78508keunyoung                protected boolean check() {
1254594468cc37000395ee2a000da08651e73e78508keunyoung                return mActivity.hasWindowFocus();
1264594468cc37000395ee2a000da08651e73e78508keunyoung            }
1274594468cc37000395ee2a000da08651e73e78508keunyoung        }.run();
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
2824bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
2854bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3074bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3134bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
432325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    public void testGetTextColor() {
433325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        // TODO: How to get a suitable TypedArray to test this method.
434325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
435325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        try {
436325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            TextView.getTextColor(mActivity, null, -1);
437325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            fail("There should be a NullPointerException thrown out.");
438325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        } catch (NullPointerException e) {
439325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        }
440325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    }
441325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
63553959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
63653959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
6979c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
6989c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
7069c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7139c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float expected = originalLineHeight * mult + add;
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        expected = originalLineHeight * mult + add;
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
82672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
84272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
84572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
84672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
85772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
86907b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
87007b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
87107b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
87207b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
87307b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
87407b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
87507b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
87607b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
87872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
928e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
932e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
936e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
940e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
946e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
130353b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        final String errorText = "Oops! There is an error";
1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
13139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable icon = getDrawable(R.drawable.failed);
1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1333300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1343dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
1345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
134753b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        assertEquals(errorText, mTextView.getError().toString());
1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1349300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
1350300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
1351300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
1352300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
1353300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
1354300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
1355300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
1356300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
1357300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
1358300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
1359dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
1378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1385dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
1388dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1391dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1405fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
1406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1413fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
1425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
1432fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        /* Cursor coordinates from getPrimaryHorizontal() may have a fractional
1433fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * component, while the result of getFocusedRect is in int coordinates.
1434fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * It's not practical for these to match exactly, so we compare that the
1435fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * integer components match - there can be a fractional pixel
1436fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * discrepancy, which should be okay for all practical applications. */
1437fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left);
1438fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right);
1439fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1440fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1441fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1442fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1443fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1444fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1445fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1446fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
1447fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1448fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1449fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1450fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1451fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1452fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1453fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left);
1454fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right);
1455fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1456fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1457fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1458fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
1459fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
1460fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1461fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
1462fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1463fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
1464fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1465fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1466fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1467fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1468fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1469fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1470fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
1471fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1472fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1473fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1474fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1475fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1476fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1477fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left);
1478fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right);
1479fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1480fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1481fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1482fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1483fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1484fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1485fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1486fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
1487fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1488fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1489fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1490fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1491fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1492fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
1493fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
1494fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
1495fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
1496fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1497fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
1498fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1500fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
1537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
1539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
1586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1598dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1600dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
1607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
1611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
1618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
1621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
1626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
1629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
1632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
1633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
1635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
1636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
1637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
1638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
1640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
1641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
1642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
1643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
1644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
1645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
1646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
1648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
1649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
1650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
1653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
1655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
1657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
1658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
1659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
1662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
1664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
1666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
1668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
1669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
1670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
1671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
1673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
1674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
1675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
1676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
1677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
1678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
1680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
1681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
1682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
1683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
1687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
1688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
1690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
1693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
1696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
1697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
1699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
1700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
1702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
1703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
1705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
1706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
1708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
1709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
1711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
1712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
1714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
1717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
1718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
1719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
1720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
1722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
1723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
1726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
1729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
1730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
1733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
1737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
1741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
1745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
1746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
1749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
1754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
1756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
1757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
1758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
1759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
1760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
1762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
1763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
1764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
1766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
1767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
1769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
1770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
1771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
1773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
1774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
1776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
1777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
1781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
1782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
1783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
1784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
1786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
1787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
1788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
1789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
1790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
1791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
1792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
1793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
1794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
1796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
1797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
1799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
1800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
1801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
1803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
1804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
1806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
1807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
1809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
1810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
1812119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
1813c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // and android:style is not set or is set to normal, and
1814c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // android:fontFamily is not set
1815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
1816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
1818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
1819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
1820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
1821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
1822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
1824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
1825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
1826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
1827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
1829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
1830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
1831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
1833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
1834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
1835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
1839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
1842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
1843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
1845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
1846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
1847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
1848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
1849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
1850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
1853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
1854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
1855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
1858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
1859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
1860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
1863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
1865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
1866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
1867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
1870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
1872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
1873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
1874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
1877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
1879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
1880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
1885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
1886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
1887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
1888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
1889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
1892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
1893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
1894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
1895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
1898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
1899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
1900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
1901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
190522d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
1906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
1912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
1915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
1918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
19230162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
1924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
1925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
1926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
192722d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
192822d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
1929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
1931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
1933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
1936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
1940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
1944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
1946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
1947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
1948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
1949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
1950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
1953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
1954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
1955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
1958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
1959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
1960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
1962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
1963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
1964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
1965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
1966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
1967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
1968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
1969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
1970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
1971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
19739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.blue);
19749776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.yellow);
19759776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable top = getDrawable(R.drawable.red);
1976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
1978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
1979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
1980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
1982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
1983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
1984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
1985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
1986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
1987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
1988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
1991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
1992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
1993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
1994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
1995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
1996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
1997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
1998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
2000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
2001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
2002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
2003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
2004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
2005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
2018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
2020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
2022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
2027013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
2028013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
2029013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
2030013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2031013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
2032013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
2033013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2034013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
2035013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2036013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2037013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
2038013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2039013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2040013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
2041013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
2042013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
2043013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
2044013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
2045013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
2046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2048013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2049013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineWidth = textView.getLayout().getWidth();
2050013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineHeight = textView.getLayout().getHeight();
2051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2054013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
2055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2058013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
2059013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getHeight() > singleLineHeight);
2060013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getWidth() < singleLineWidth);
2061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
2063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2065013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
2066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2070013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2071013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineHeight, textView.getLayout().getHeight());
2072013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineWidth, textView.getLayout().getWidth());
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
2087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
2088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
2090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
210072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
210172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
210372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
2122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
213472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
213572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
213672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
213772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
21479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
21669776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
21849776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
22109776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
22399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.red);
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
22579776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.red);
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
2300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextAppearance() {
2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
2323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFadingEdgeStrength() {
245741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewLeft = (MockTextView) mActivity.findViewById(
245841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_left);
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
246141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewLeft.setEllipsize(null);
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on right side if the text aligns left
246741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewLeft.getLeftFadingEdgeStrength(), 0.01f);
246841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewLeft.getRightFadingEdgeStrength(), 0.01f);
2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
247041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewRight = (MockTextView) mActivity.findViewById(
247141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_right);
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
247441f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewRight.setEllipsize(null);
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on left side if the text aligns right
247941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewRight.getLeftFadingEdgeStrength(), 0.01f);
248041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewRight.getRightFadingEdgeStrength(), 0.01f);
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
248241f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewCenter = (MockTextView) mActivity.findViewById(
248341f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_center);
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
248641f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewCenter.setEllipsize(null);
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the text aligns center
249141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getLeftFadingEdgeStrength(), 0.01f);
249241f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getRightFadingEdgeStrength(), 0.01f);
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2495bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
2501bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2502bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2503bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2504bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
2505bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2511bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
25290162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
253772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float leftFadingEdgeStrength = textView.getLeftFadingEdgeStrength();
253872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float rightFadingEdgeStrength = textView.getRightFadingEdgeStrength();
253972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to continue
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the left fading becomes thicker while the right fading becomes thiner
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // as the text moves towards left
25430162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && rightFadingEdgeStrength > textView.getRightFadingEdgeStrength();
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
2629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
2646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
2670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
2707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
2709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
277472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
277572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
277672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
277772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
277872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
277972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
278072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
27819776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
278272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
278372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
278472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
278572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
278672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
278772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
278872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
278972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
279072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
279172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
279372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
279472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
279672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
279772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
279872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
280072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
280172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
280372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
280472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
280672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
280772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
280972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
281072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
281172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
281272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
281372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
281472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
281572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
281672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
281772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
281872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
281972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
282072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
282172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
282272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
282372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
282472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
282572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
282672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
282772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
282872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
282972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
283072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
283172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
283272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
283372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
283472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
283572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
283672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
2837c873101a88e7ba584065de5e912508237378ca99Victoria Lease    public void testSetTextLong() {
2838c873101a88e7ba584065de5e912508237378ca99Victoria Lease        final int MAX_COUNT = 1 << 21;
2839c873101a88e7ba584065de5e912508237378ca99Victoria Lease        char[] longText = new char[MAX_COUNT];
2840c873101a88e7ba584065de5e912508237378ca99Victoria Lease        for (int n = 0; n < MAX_COUNT; n++) {
2841c873101a88e7ba584065de5e912508237378ca99Victoria Lease            longText[n] = 'm';
2842c873101a88e7ba584065de5e912508237378ca99Victoria Lease        }
2843c873101a88e7ba584065de5e912508237378ca99Victoria Lease        mTextView = findTextView(R.id.textview_text);
2844c873101a88e7ba584065de5e912508237378ca99Victoria Lease        mTextView.setText(new String(longText));
2845c873101a88e7ba584065de5e912508237378ca99Victoria Lease    }
2846c873101a88e7ba584065de5e912508237378ca99Victoria Lease
2847c873101a88e7ba584065de5e912508237378ca99Victoria Lease    @UiThreadTest
284872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
284972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
285072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
285172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
285272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
285372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
285472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
285572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
285672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
285772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
285872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
285972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
286072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
286172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
286272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
286372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
286472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
286572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
286672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
286772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
286872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
286972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
287072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
287172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
287272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
287372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
287472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
287572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
287672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
287772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
287872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
287972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
288072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
288172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
288272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
288372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
288472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
288572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
288672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
288772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
288872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
288972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
289072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
289172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
289272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
289372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
289472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
289572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
289672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
289772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
289872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
289972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
290072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
290172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
290272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
290372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
290472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
290572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
290672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
290772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
290872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
2909afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
291072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
291172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
291272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
291372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
2914afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
2915afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
2916afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
2917afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
2918afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
2919afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
2920afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
2921afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
2922afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
292304d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
292404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
292504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
292604d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
292704d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
292804d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
292904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
293072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
293172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
293372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
293472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
293672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
293772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
293872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
294072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
294172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
294272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
294372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
294472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
294572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
294672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
294772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
294872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
294972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
295072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
295172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
295272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
295372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
295472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
295572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
295672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
295772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
295872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
295972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
296072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
296172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
296272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
296372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
296472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
296572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
296672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
296772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
296872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
296972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
297072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
297172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
297272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
297372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
297472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
297572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
29769776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
297772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
297872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
297972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
298072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
298172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
298272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
298372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
2984c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
298572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
298672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
298772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
298872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
298972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
299072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
299172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
299272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
299372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
299472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
299572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
299672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
299772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
299872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
299972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
300072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
300172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
300272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
300372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
300472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
300572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
300672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
300772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
300872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
300972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
301072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
301194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
301294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
3013c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
30142a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
301594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
301694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
301794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
301894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
3019c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
302094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
302394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
302694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
302994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30312a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
303294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30342a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
303594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30372a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
303894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
303994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
304094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
304194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
3042c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
304394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
304494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
30452a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
304694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
304794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30482a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
304994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30512a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
305294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30542a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
305594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
305894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
306194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
306294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
306494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
306594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
306694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
306794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
3068c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
306994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
307094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3071c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
307294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
307394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
307494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
307594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30762a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
307794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
307894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30792a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
308094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30822a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
308394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30852a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
308694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30882a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
308994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
309094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
309294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
309394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
309494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
309594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
3096c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
309794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
309894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
30992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
310094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
310194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
31022a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
310394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
310494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
31052a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
310694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
310794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31082a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
310994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
31112a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
311294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
31142a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
311594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
31172a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
311894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
311994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
312194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
3122c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
312394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
312494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3125c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
312694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
312794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
312894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
31302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
313194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
31332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
313494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
313794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
31392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
314094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
314194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
31422a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
314394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
314494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
31452a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
314694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
314794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
314894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
314994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
315094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
31512a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
315294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
315394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
31542a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
315594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
315694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
315894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
315994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
31602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
316194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
316294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
31632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
316494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
316594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
31662a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
316794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
316894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
316994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
317094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
3171c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
3172c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
317394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
317494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
317594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31762a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
317794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3178f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
317994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
3180f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
3181f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
3182f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
3183f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
31842a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
318594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
318694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3187dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3188dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
3189dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
31907fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3191dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
31927fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3193dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3194dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3195dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3196dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
3197dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3198dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3199dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
32007fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3201dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3202dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32037fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
3204dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3205dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32067fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
3207dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3208dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32097fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
3210dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3211dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32127fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
3213dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3214dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32157fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
3216dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3217dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3218dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3219dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
3220dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3221dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
32227fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3223dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3224757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
3225dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32267fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3227dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3228757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
3229757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3230757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3231757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
3232dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32337fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3234dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3235dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32367fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3237dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3238dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32397fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3240dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3241dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32427fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3243dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3244dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3245dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3246dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
3247dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
3248dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3249dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3250dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3251dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
3252dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3253dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
32547fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3255dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3256dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3257dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
3258dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
32597fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
3260dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3261dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3263dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3264dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3266dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3267dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32687fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3269dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3270dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32717fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3272dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3273dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32747fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3275dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3276dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
3277dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3278dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3279dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32807fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3281dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3282dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32837fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3284dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3285dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32867fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3287dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3288dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32897fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3290dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3291dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32927fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3293dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3294dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3295dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3296dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
3297dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextViewStubActivity activity = getActivity();
3298dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3299dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
3300dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
3301dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3302dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3303dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
33047fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3305dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
33064f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // No reset when we remove the view
3307dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
33084f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
33094f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio
33104f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Reset is done when we add the view
33114f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Default text alignment is GRAVITY
33124f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        ll.addView(tv);
33137fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3314dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3315dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3316b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
3317b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
3318b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
3319b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
3320b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
3321b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
3322b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3323b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextViewStubActivity activity = getActivity();
3324b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3325b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
3326b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
3327b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
3328b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3329b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3330b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3331b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3332b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3333b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3334b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3335b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3336b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3337b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3338b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
3339b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
3340b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3341b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3342b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3343b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3344b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3345b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3346b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3347b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3348b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3349b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3350b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3351b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
3352b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
3353b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3354b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3355b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3356b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3357b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3358b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3359b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3360b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3361b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3362b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3363b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3364b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
3365b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
3366b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3367b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3368b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3369b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3370b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3371b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3372b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3373b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3374b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3375b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3376b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3377b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
3378b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3379b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3380b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3381b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3382b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3383b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3384b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3385b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3386b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3387b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3388b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3389b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3390b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
3391b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3392b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3393b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3394b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3395b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3396b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3397b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3398b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3399b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3400b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3401b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3402b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3403b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
3404b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3405b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
3406b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3407b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3408b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3409b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3410b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3411b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3412b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3413b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3414b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3415b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3416b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3417b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
3418b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3419b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
3420b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3421b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3422b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3423b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3424b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3425b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3426b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3427b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3428b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3429b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3430b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3431b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
3432b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3433b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3434b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3435b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3436b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3437b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3438b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3439b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3440b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3441b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3442b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3443b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3444b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3445b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
3446b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3447b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3448b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3449b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3450b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3451b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3452b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3453b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3454b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3455b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3456b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3457b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3458b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
3459b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
34609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    @UiThreadTest
34619776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    public void testDrawableResolution2() {
34629776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int LEFT = 0;
34639776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int TOP = 1;
34649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int RIGHT = 2;
34659776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int BOTTOM = 3;
34669776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34679776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextViewStubActivity activity = getActivity();
34689776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34699776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
34709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
34719776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
34729776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
34749776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
34759776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
34769776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
34779776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
34789776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
34799776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
34809776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
34819776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34829776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null);
34839776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
34849776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34859776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
34869776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
34879776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
34889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
34899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
34909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
34929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
34939776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
34949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
34959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
34969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
34979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
34989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
34999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
35009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
35019776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
35029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35039776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null);
35049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
35059776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35069776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
35079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
35089776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
35099776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
35109776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
35119776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35129776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_ltr);
35139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
35149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35159776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
35169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
35179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
35189776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
35199776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, getDrawable(R.drawable.icon_red), null);
35219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
35229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
35249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
35259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
35269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
35279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
35289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
35299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null);
35319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
35329776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
35349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
35359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
35369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
35379776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
35389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
35399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
354072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
354172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
354272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
354372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
354472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
354572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
354672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
354772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
354872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
354972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
355072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
355172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
355272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
35809776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return ((BitmapDrawable) getDrawable(resid)).getBitmap();
35819776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
35829776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
35839776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    private Drawable getDrawable(int resid) {
35849776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return mActivity.getResources().getDrawable(resid);
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
3688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
3768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
3769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
3773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
3777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
3778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
3781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
3783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
3784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
3785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3792e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
3802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
3803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
3807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
3814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
3815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
3817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
3819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
3820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
3821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
3826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
3855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
3890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
3903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
3913