TextViewTest.java revision f0d2af33ae194bead489caef9b461f2bee6f45a6
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();
122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
2764bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
2794bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3014bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3074bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColor() {
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            TextView.getTextColor(mActivity, null, -1);
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("There should be a NullPointerException thrown out.");
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
6909c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
6919c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
6999c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7069c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float expected = originalLineHeight * mult + add;
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        expected = originalLineHeight * mult + add;
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
81972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
83572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
83872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
83972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
85072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
86207b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
86307b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
86407b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
86507b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
86607b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
86707b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
86807b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
86907b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
87172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
921e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
925e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
929e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
933e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
939e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(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        // there is no selection.
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(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        // there is no selection.
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(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        // there is no selection.
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(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        // there is no selection.
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(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        // there is no selection.
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final String errorText = "Opps! There is an error";
1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable icon = mActivity.getResources().getDrawable(R.drawable.failed);
1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1326300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1336dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
13408b76fb121a40e93bbf13919482761b50654878bfBrian Muramatsu        assertNull(mTextView.getError());
1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1342300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
1343300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
1344300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
1345300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
1346300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
1347300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
1348300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
1349300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
1350300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
1351300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
1352dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1378dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
1381dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1384dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1398fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1406fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
1425fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(3), (float) rc.left);
1426fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(13), (float) rc.right);
1427fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1428fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1429fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1430fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1431fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1432fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1433fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1434fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
1435fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1436fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1437fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1438fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1439fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1440fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1441fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(3) - 2, (float) rc.left);
1442fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(3) + 2, (float) rc.right);
1443fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1444fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1445fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1446fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
1447fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
1448fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1449fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
1450fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1451fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
1452fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1453fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1454fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1455fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1456fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1457fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1458fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
1459fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1460fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1461fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1462fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1463fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1464fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1465fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(2), (float) rc.left);
1466fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getPrimaryHorizontal(4), (float) rc.right);
1467fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1468fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1469fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1470fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1471fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1472fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1473fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1474fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
1475fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1476fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1477fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1478fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1479fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1480fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
1481fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
1482fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
1483fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
1484fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1485fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
1486fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
1487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1488fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
1519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
1538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
1540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
1556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
1558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1586dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1588dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
1590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
1606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
1609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
1614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
1617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
1620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
1621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
1623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
1624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
1625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
1626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
1628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
1629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
1630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
1631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
1632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
1633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
1634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
1636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
1637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
1638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
1641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
1643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
1645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
1646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
1647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
1650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
1652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
1654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
1656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
1657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
1658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
1659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
1661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
1662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
1663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
1664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
1665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
1666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
1668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
1669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
1670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
1671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
1675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
1676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
1678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
1681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
1684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
1685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
1687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
1688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
1690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
1691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
1693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
1694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
1696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
1697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
1699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
1700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
1702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
1703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
1705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
1706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
1707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
1708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
1710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
1711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
1714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
1717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
1718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
1721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
1725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
1729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
1733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
1734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
1737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
1742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
1744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
1745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
1746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
1747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
1748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
1750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
1751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
1752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
1754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
1755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
1757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
1758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
1759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
1761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
1762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
1763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
1764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
1765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
1769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
1770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
1771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
1772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
1774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
1775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
1776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
1777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
1778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
1779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
1780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
1781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
1782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
1784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
1785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
1787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
1788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
1789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
1791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
1792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
1794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
1795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
1797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
1798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
1800119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
1801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // and android:style is not set or is set to normal
1802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
1803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
1805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
1806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
1807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
1808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
1809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
1811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
1812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
1813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
1814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
1816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
1817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
1818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
1820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
1821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
1822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
1826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
1829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
1830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
1832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
1833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
1834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
1835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
1836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
1837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
1840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
1841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
1842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
1845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
1846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
1847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
1850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
1852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
1853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
1854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
1857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
1859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
1860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
1861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
1864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
1866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
1867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
1872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
1873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
1874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
1875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
1876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
1879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
1880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
1881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
1882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
1885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
1886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
1887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
1888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
189222d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
1893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
1899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
1900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
1902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
1905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
19100162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
1911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
1912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
1913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
191422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
191522d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
1916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
1918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
1920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
1923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
1927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
1931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
1933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
1934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
1935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
1936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
1937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
1940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
1941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
1942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
1944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
1945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
1946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
1947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
1949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
1950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
1951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
1952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
1953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
1954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
1955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
1956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
1958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable left = mActivity.getResources().getDrawable(R.drawable.blue);
1961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable right = mActivity.getResources().getDrawable(R.drawable.yellow);
1962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
1963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
1965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
1966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
1967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
1969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
1970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
1971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
1972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
1973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
1974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
1975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
1976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
1978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
1979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
1980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
1981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
1982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
1983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
1984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
1985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
1987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
1988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
1989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
1990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
1991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
1992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
1993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
1995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
1996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
1997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
1998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
1999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
2005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
2007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
2009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
2014013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
2015013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
2016013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
2017013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2018013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
2019013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
2020013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2021013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
2022013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2023013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2024013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
2025013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2026013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2027013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
2028013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
2029013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
2030013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
2031013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
2032013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
2033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2035013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2036013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineWidth = textView.getLayout().getWidth();
2037013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineHeight = textView.getLayout().getHeight();
2038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2041013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
2042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2045013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
2046013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getHeight() > singleLineHeight);
2047013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getWidth() < singleLineWidth);
2048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
2050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2052013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
2053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2057013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2058013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineHeight, textView.getLayout().getHeight());
2059013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineWidth, textView.getLayout().getWidth());
2060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
2064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
2067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
2068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
2069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
2070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
2071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
208772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
208872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
209072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
2097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
2100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
2103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
212172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
212272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
212372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
212472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
2125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable bottom = mActivity.getResources().getDrawable(R.drawable.red);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
2186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable bottom = mActivity.getResources().getDrawable(R.drawable.red);
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable left = mActivity.getResources().getDrawable(R.drawable.red);
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable right = mActivity.getResources().getDrawable(R.drawable.red);
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
2298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
2300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextAppearance() {
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFadingEdgeStrength() {
244441f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewLeft = (MockTextView) mActivity.findViewById(
244541f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_left);
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
244841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewLeft.setEllipsize(null);
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on right side if the text aligns left
245441f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewLeft.getLeftFadingEdgeStrength(), 0.01f);
245541f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewLeft.getRightFadingEdgeStrength(), 0.01f);
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
245741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewRight = (MockTextView) mActivity.findViewById(
245841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_right);
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
246141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewRight.setEllipsize(null);
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on left side if the text aligns right
246641f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewRight.getLeftFadingEdgeStrength(), 0.01f);
246741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewRight.getRightFadingEdgeStrength(), 0.01f);
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
246941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewCenter = (MockTextView) mActivity.findViewById(
247041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_center);
2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
247341f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewCenter.setEllipsize(null);
2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the text aligns center
247841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getLeftFadingEdgeStrength(), 0.01f);
247941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getRightFadingEdgeStrength(), 0.01f);
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2482bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
2488bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2489bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2490bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2491bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
2492bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2498bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
25160162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
252472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float leftFadingEdgeStrength = textView.getLeftFadingEdgeStrength();
252572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float rightFadingEdgeStrength = textView.getRightFadingEdgeStrength();
252672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to continue
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the left fading becomes thicker while the right fading becomes thiner
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // as the text moves towards left
25300162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && rightFadingEdgeStrength > textView.getRightFadingEdgeStrength();
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
2646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
2669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
2671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
2707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
2709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
2710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
276172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
276272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
276372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
276472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
276572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
276672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
276772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
276872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Drawable d = mActivity.getResources().getDrawable(R.drawable.pass);
276972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
277072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
277172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
277272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
277372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
277472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
277572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
277672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
277772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
277872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
277972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
278072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
278172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
278272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
278372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
278472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
278572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
278672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
278772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
278872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
278972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
279072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
279172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
279372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
279472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
279672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
279772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
279872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
279972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
280072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
280172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
280272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
280472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
280572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
280772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
280872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
280972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
281072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
281172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
281272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
281372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
281472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
281572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
281672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
281772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
281872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
281972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
282072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
282172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
282272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
282372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
282472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
282572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
282672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
282772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
282872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
282972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
283072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
283172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
283272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
283372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
283472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
283572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
283672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
283772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
283872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
283972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
284072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
284172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
284272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
284372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
284472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
284572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
284672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
284772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
284872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
284972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
285072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
285172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
285272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
285372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
285472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
285572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
285672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
285772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
285872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
285972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
286072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
286172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
286272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
286372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
286472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
286572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
286672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
286772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
286872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
286972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
287072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
287172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
287272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
287372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
287472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
287572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
287672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
287772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
287872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
287972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
288072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
288172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
288272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
288372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
288472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
2885afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
288672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
288772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
288872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
288972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
2890afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
2891afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
2892afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
2893afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
2894afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
2895afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
2896afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
2897afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
2898afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
289904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
290004d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
290104d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
290204d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
290304d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
290404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
290504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
290672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
290772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
290872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
290972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
291072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
291172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
291272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
291372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
291472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
291572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
291672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
291772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
291872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
291972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
292072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
292172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
292272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
292372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
292472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
292572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
292672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
292772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
292872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
292972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
293172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
293272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
293372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
293472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
293572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
293772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
293872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
293972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
294072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
294172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
294272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
294372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
294472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
294572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
294672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
294772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
294872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
294972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
295072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
295172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
295272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Drawable d = mActivity.getResources().getDrawable(R.drawable.pass);
295372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
295472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
295572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
295672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
295772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
295872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
295972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
2960c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
296172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
296272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
296372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
296472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
296572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
296672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
296772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
296872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
296972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
297072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
297172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
297272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
297372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
297472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
297572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
297672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
297772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
297872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
297972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
298072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
298172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
298272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
298372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
298472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
298572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
298672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
298794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
298894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
2989c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
29902a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
299194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
299294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
299394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
299494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
2995c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
299694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
299794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
29982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
299994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
300094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30012a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
300294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
300394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30042a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
300594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
300694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30072a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
300894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
300994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30102a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
301194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
301294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30132a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
301494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
301594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
301694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
301794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
3018c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
301994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
302094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
30212a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
302294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
302594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
302894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
302994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
303194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
303494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
303794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
303894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
304094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
304194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
304294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
304394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
3044c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
304594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
304694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3047c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
304894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
304994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
305094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30522a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
305394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30552a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
305694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
305794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30582a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
305994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
306094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30612a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
306294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
306394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30642a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
306594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
306694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30672a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
306894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
306994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
307094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
307194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
3072c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
307394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
307494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
30752a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
307694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
307794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
30782a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
307994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
30812a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
308294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
30842a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
308594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
30872a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
308894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
308994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
30902a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
309194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
309294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
30932a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
309494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
309594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
309694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
309794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
3098c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
309994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
310094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3101c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
310294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
310394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
310494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
310594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
31062a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
310794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
310894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
31092a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
311094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31122a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
311394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
31152a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
311694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
311794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
31182a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
311994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
31212a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
312294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
312494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
312594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
31272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
312894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
312994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
31302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
313194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
313494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
31362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
313794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
313894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
31392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
314094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
314194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
31422a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
314394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
314494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
314594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
314694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
3147c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
3148c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
314994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
315094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
315194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
31522a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
315394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3154f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
315594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
3156f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
3157f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
3158f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
3159f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
31602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
316194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
316294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3163dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3164dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
3165dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
31667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3167dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
31687fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3169dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3170dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3171dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3172dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
3173dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3174dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3175dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
31767fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3177dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3178dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
31797fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
3180dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3181dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
31827fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
3183dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3184dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
31857fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
3186dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3187dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
31887fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
3189dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3190dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
31917fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
3192dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3193dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3194dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3195dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
3196dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3197dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
31987fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3199dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3200757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
3201dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32027fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3203dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3204757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
3205757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3206757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3207757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
3208dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32097fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3210dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3211dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32127fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3213dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3214dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32157fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3216dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3217dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32187fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3219dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3220dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3221dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3222dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
3223dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
3224dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3225dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3226dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3227dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
3228dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3229dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
32307fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3231dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3232dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3233dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
3234dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
32357fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
3236dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3237dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32387fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3239dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3240dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32417fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3242dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3243dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32447fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3245dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3246dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32477fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3248dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3249dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32507fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3251dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3252dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
3253dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3254dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3255dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
32567fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3257dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3258dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
32597fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3260dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3261dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
32627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3263dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3264dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
32657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3266dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3267dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
32687fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3269dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3270dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3271dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3272dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
3273dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextViewStubActivity activity = getActivity();
3274dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3275dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
3276dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
3277dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3278dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3279dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
32807fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3281dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3282dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
3283dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // default text alignment is GRAVITY
32847fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3285dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3286dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3287b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
3288b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
3289b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
3290b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
3291b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
3292b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
3293b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3294b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextViewStubActivity activity = getActivity();
3295b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3296b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
3297b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
3298b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
3299b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3300b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3301b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3302b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3303b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3304b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3305b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3306b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3307b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3308b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3309b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
3310b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
3311b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3312b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3313b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3314b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3315b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3316b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3317b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3318b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3319b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3320b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3321b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3322b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
3323b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
3324b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3325b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3326b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3327b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3328b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3329b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3330b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3331b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3332b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3333b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3334b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3335b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
3336b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
3337b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3338b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3339b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3340b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3341b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3342b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3343b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3344b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3345b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3346b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3347b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3348b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
3349b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3350b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3351b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3352b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3353b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3354b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3355b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3356b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3357b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3358b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3359b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3360b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3361b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
3362b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3363b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3364b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3365b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3366b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3367b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3368b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3369b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3370b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3371b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3372b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3373b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3374b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
3375b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3376b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
3377b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3378b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3379b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3380b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3381b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3382b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3383b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3384b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3385b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3386b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3387b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3388b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
3389b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3390b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
3391b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3392b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3393b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3394b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3395b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3396b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3397b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3398b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3399b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3400b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3401b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3402b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
3403b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3404b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3405b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3406b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3407b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3408b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3409b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3410b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3411b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3412b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3413b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3414b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3415b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3416b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
3417b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3418b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3419b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3420b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3421b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3422b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3423b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3424b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3425b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3426b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3427b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3428b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3429b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
3430b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
343172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
343272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
343372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
343472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
343572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
343672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
343772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
343872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
343972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
344072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
344172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
344272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
344372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
3457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
3463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
3468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
3471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return ((BitmapDrawable) mActivity.getResources().getDrawable(resid)).getBitmap();
3472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
3475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
3484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
3487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
3493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
3496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
3502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
3505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
3511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
3514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
3521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
3522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
3524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
3525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
3527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
3530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
3536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
3539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
3545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
3548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
3660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3679e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
3768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
3769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
3770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
3771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
3773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
3777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
3778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
3779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
3781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
3785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
3800