TextViewTest.java revision c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6
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
194ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luoimport com.android.cts.widget.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;
31d82745ff4a8b174f7be1258fd329dedc52ce58bbChenjie Luoimport android.cts.util.WidgetTestUtils;
32fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
33fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
34fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
35afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path;
36fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
37afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF;
38fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
41fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
435b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
4572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
48fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter;
49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType;
50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout;
51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection;
52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable;
53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString;
54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
57afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher;
58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
70afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize;
71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
76fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
78afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity;
80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View;
82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnCreateContextMenuListener;
83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnLongClickListener;
84afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup;
8572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection;
8672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo;
8772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText;
8872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest;
89c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection;
90c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText;
91bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout;
9262808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout;
93fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller;
94fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView;
95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType;
9672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener;
97fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
1034ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luopublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
104fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
1097375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "the width of the view. New devices have a much larger screen which "
1107375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "actually enables long strings to be displayed with no fading. "
1117375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "I have made this string longer to fix this case. If you are correcting "
1127375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "this text, I would love to see the kind of devices you guys now use!";
113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
11422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
1174ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        super("com.android.cts.widget", TextViewCtsActivity.class);
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
1244594468cc37000395ee2a000da08651e73e78508keunyoung        new PollingCheck() {
1254594468cc37000395ee2a000da08651e73e78508keunyoung            @Override
1264594468cc37000395ee2a000da08651e73e78508keunyoung                protected boolean check() {
1274594468cc37000395ee2a000da08651e73e78508keunyoung                return mActivity.hasWindowFocus();
1284594468cc37000395ee2a000da08651e73e78508keunyoung            }
1294594468cc37000395ee2a000da08651e73e78508keunyoung        }.run();
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
13328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    /**
13428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     * Promotes the TextView to editable and places focus in it to allow simulated typing.
13528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     */
13628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    private void initTextViewForTyping() {
13728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mActivity.runOnUiThread(new Runnable() {
13828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            public void run() {
13928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView = findTextView(R.id.textview_text);
14028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
14128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setText("", BufferType.EDITABLE);
14228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.requestFocus();
14328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            }
14428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        });
14528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.waitForIdleSync();
14628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
14728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
2994bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
3024bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3244bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3304bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
449325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    public void testGetTextColor() {
450325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        // TODO: How to get a suitable TypedArray to test this method.
451325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
452325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        try {
453325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            TextView.getTextColor(mActivity, null, -1);
454325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            fail("There should be a NullPointerException thrown out.");
455325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        } catch (NullPointerException e) {
456325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        }
457325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    }
458325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
65253959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
65353959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
7149c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
7159c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
7239c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7309c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float expected = originalLineHeight * mult + add;
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        expected = originalLineHeight * mult + add;
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
84372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
85972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
86272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
86372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
87472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
88607b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
88707b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
88807b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
88907b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
89007b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
89107b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
89207b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
89307b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
89572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
945e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
949e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
953e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
957e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
963e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1261c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_insert() {
126228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
12635b51f77b99861d48fec1c327252416f726b3b01aJames Cook
12645b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text.
12655b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
12665b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
12675b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
126828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The cursor is at the end of the text.
126928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
12705b51f77b99861d48fec1c327252416f726b3b01aJames Cook
12715b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo removes the typed string in one step.
12725b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
12735b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
127428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
12755b51f77b99861d48fec1c327252416f726b3b01aJames Cook
127628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo restores the text and cursor position.
12775b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
12785b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
127928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
12805b51f77b99861d48fec1c327252416f726b3b01aJames Cook
12815b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undoing the redo clears the text again.
12825b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
12835b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
12845b51f77b99861d48fec1c327252416f726b3b01aJames Cook
12855b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo when the undo stack is empty does nothing.
12865b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
12875b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
12885b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
12895b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
12905b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
129128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
12925b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1293c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_delete() {
129428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
12955b51f77b99861d48fec1c327252416f726b3b01aJames Cook
129628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Simulate deleting text and undoing it.
129728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("xyz");
129828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
12995b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
13005b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
130128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The text was actually deleted.
130228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
130328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
130428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
130528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undo restores the typed string and cursor position in one step.
13065b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
130728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
130828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13095b51f77b99861d48fec1c327252416f726b3b01aJames Cook
131028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo removes the text in one step.
131128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
131228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
131328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13145b51f77b99861d48fec1c327252416f726b3b01aJames Cook
131528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing the redo restores the text again.
131628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
131728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
131828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
131928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
132028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing again undoes the original typing.
13215b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13225b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
132328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13245b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
13255b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
13265b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
132728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
13285b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1329c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Initialize the text view for simulated IME typing. Must be called on UI thread.
1330c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private InputConnection initTextViewForSimulatedIme() {
1331c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView = findTextView(R.id.textview_text);
1332c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
1333c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("", BufferType.EDITABLE);
1334c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        return mTextView.onCreateInputConnection(new EditorInfo());
1335c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1336c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1337c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Simulates IME composing text behavior.
1338c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
1339c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1340c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText(text, 1);  // Leave cursor at end.
1341c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1342c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1343c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1344c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1345c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertLatin() {
1346c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1347c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1348c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
1349c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // such as "c" -> "ca" -> "cat" -> "cat ".
1350c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "c");
1351c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "ca");
1352c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1353c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The completion and space are added in the same batch.
1354c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1355c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("cat", 1);
1356c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText(" ", 1);
1357c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1358c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1359c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements undo in a single step.
1360c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1361c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1362c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1363c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1364c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1365c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertJapanese() {
1366c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1367c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1368c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
1369c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1370c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String NA = "\u306A";  // HIRAGANA LETTER NA
1371c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1372c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1373c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1374c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + NA);
1375c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1376c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The result may be a surrogate pair. The composition ends in the same batch.
1377c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1378c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
1379c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText("", 1);
1380c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1381c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1382c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements are a single undo step.
1383c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1384c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1385c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1386c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1387c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1388c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeCancel() {
1389c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1390c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1391c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1392c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Start typing a composition.
1393c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1394c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1395c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1396c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1397c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1398c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Cancel the composition.
1399c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "");
1400c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1401c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1402c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1403c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1404c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1405c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1406c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1407c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1408c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1409c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeEmptyBatch() {
1410c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1411c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1412c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1413c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Send an empty batch edit. This happens if the IME is hidden and shown.
1414c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1415c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1416c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1417c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1418c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1419c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1420c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1421c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1422c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1423c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1424c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_setText() {
1425277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
142628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1427c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Create two undo operations, an insert and a delete.
1428c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mInstrumentation.sendStringSync("xyz");
1429c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
1430277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1431277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1432c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook                // Calling setText() clears both undo operations, so undo doesn't happen.
1433277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1434277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1435277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
143628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1437277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Clearing text programmatically does not undo either.
1438277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("", BufferType.EDITABLE);
1439277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1440277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1441277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1442277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1443277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1444277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
144528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1446c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testRedo_setText() {
1447277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1448277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1449277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text. This creates an undo entry.
1450277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1451277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1452277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1453277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo the typing to create a redo entry.
1454277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1455277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1456277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Calling setText() clears the redo stack, so redo doesn't happen.
1457277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1458277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
1459277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
1460277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1461277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1462277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1463277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1464277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1465c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directAppend() {
1466277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
146728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1468277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1469277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1470277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1471277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1472277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Programmatically append some text.
1473277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.append("def");
1474277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abcdef", mTextView.getText().toString());
1475277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1476277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the append as a separate step.
1477277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1478277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1479277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1480277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1481277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1482277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1483277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1484277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1485277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1486277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1487277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1488c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directInsert() {
1489277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1490277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1491277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1492277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1493277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1494277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1495277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Directly modify the underlying Editable to insert some text.
1496277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // NOTE: This is a violation of the API of getText() which specifies that the
1497277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // returned object should not be modified. However, some apps do this anyway and
1498277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // the framework needs to handle it.
1499277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                Editable text = (Editable) mTextView.getText();
1500277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                text.insert(0, "def");
1501277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("defabc", mTextView.getText().toString());
1502277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1503277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the insert as a separate step.
1504277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1505277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1506277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1507277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1508277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1509277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1510277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1511277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1512277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1513277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1514277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1515c530472a02205f0b7d87f9f06140c56ca0849816James Cook    public void testUndo_noCursor() {
1516c530472a02205f0b7d87f9f06140c56ca0849816James Cook        initTextViewForTyping();
1517c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1518c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mActivity.runOnUiThread(new Runnable() {
1519c530472a02205f0b7d87f9f06140c56ca0849816James Cook            public void run() {
1520c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Append some text to create an undo operation. There is no cursor present.
1521c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.append("cat");
1522c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1523c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Place the cursor at the end of the text so the undo will have to change it.
1524c530472a02205f0b7d87f9f06140c56ca0849816James Cook                Selection.setSelection((Spannable) mTextView.getText(), 3);
1525c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1526c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Undo the append. This should not crash, despite not having a valid cursor
1527c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // position in the undo operation.
1528c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1529c530472a02205f0b7d87f9f06140c56ca0849816James Cook            }
1530c530472a02205f0b7d87f9f06140c56ca0849816James Cook        });
1531c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mInstrumentation.waitForIdleSync();
1532c530472a02205f0b7d87f9f06140c56ca0849816James Cook    }
1533c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1534c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_textWatcher() {
1535277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1536277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1537277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Add a TextWatcher that converts the text to spaces on each change.
1538277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1539277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1540277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1541277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1542277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1543277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1544277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // TextWatcher altered the text.
1545277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("   ", mTextView.getText().toString());
1546277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1547277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo reverses both changes in one step.
1548277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1549277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1550277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1551277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1552277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
155328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
155428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1555c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_shortcuts() {
155628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
155728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
155828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Type some text.
155928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("abc");
15605b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
15615b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
15625b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Z triggers undo.
15635b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
15645b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        KeyEvent.META_CTRL_LEFT_ON);
1565277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
15665b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
15675b51f77b99861d48fec1c327252416f726b3b01aJames Cook
15685b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Shift-Z triggers redo.
15695b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
15705b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
1571277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
157228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("abc", mTextView.getText().toString());
15735b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
15745b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
15755b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
15765b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
15775b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1578c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceState() {
157928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
15805b51f77b99861d48fec1c327252416f726b3b01aJames Cook
15815b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text to create an undo operation.
15825b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
15835b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
15845b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
15855b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Parcel and unparcel the TextView.
15865b51f77b99861d48fec1c327252416f726b3b01aJames Cook                Parcelable state = mTextView.onSaveInstanceState();
15875b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onRestoreInstanceState(state);
15885b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
15895b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
15905b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
15915b51f77b99861d48fec1c327252416f726b3b01aJames Cook
15925b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Delete a character to create a new undo operation.
15935b51f77b99861d48fec1c327252416f726b3b01aJames Cook        sendKeys(KeyEvent.KEYCODE_DEL);
15945b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
15955b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
15965b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("ab", mTextView.getText().toString());
15975b51f77b99861d48fec1c327252416f726b3b01aJames Cook
15985b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the delete.
15995b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16005b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
16015b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16025b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the typing, which verifies that the original undo operation was parceled
16035b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // correctly.
16045b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16055b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
16065f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
16075f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Parcel and unparcel the undo stack (which is empty but has been used and may
16085f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // contain other state).
16095f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
16105f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
16115f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
16125f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
16135f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
16145f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook    }
16155f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
1616c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceStateEmpty() {
16175f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        initTextViewForTyping();
16185f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
16195f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Type and delete to create two new undo operations.
16205f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("a");
16215f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
16225f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
16235f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
16245f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Empty the undo stack then parcel and unparcel the TextView. While the undo
16255f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // stack contains no operations it may contain other state.
16265f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16275f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16285f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
16295f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
16305f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
16315f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
16325f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
16335f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
16345f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Create two more undo operations.
16355f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("b");
16365f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
16375f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
16385f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
16395f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Verify undo still works.
16405f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16415f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("b", mTextView.getText().toString());
16425f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16435f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("", mTextView.getText().toString());
16445b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
16455b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
16465b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
16475b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
16485b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
1651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
1657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
1661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
1666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
1673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
1674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
1677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
1679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
1680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
1682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
1683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
1686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
1687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
1690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
1691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
1693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
1694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
1695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
1697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
1699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
1700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
1705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
170853b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        final String errorText = "Oops! There is an error";
1709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
1713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
17189776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable icon = getDrawable(R.drawable.failed);
1719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
1722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
1727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
1731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1738300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
1739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
1741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1748dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
1750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
1751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
175253b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        assertEquals(errorText, mTextView.getError().toString());
1753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1754300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
1755300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
1756300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
1757300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
1758300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
1759300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
1760300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
1761300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
1762300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
1763300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
1764dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
1765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
1766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
1767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
1768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
1772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
1773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
1774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
1783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
1789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1790dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
1793dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1796dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
1797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
1798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
1802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
1803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
1804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
1808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1810fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
1811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1818fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
1819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
1829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
1830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
1831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
1837fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        /* Cursor coordinates from getPrimaryHorizontal() may have a fractional
1838fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * component, while the result of getFocusedRect is in int coordinates.
1839fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * It's not practical for these to match exactly, so we compare that the
1840fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * integer components match - there can be a fractional pixel
1841fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * discrepancy, which should be okay for all practical applications. */
1842fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left);
1843fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right);
1844fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1845fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1846fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1847fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1848fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1849fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1850fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1851fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
1852fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1853fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1854fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1855fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1856fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1857fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1858fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left);
1859fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right);
1860fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1861fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1862fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1863fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
1864fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
1865fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1866fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
1867fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1868fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
1869fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1870fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1871fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1872fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1873fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1874fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1875fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
1876fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1877fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1878fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1879fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1880fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1881fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1882fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left);
1883fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right);
1884fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1885fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1886fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
1887fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
1888fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
1889fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
1890fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
1891fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
1892fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
1893fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
1894fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
1895fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
1896fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
1897fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
1898fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
1899fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
1900fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
1901fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
1902fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
1903fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
1904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1905fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
1906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
1908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
1910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
1911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
1916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
1918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
1921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
1922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
1923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
1925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
1926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
1929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
1930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
1934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
1935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
1936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
1939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
1942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
1944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
1946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
1948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
1951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
1955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
1967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
1968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
1969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
1970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
1973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
1975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
1978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
1987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
1988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
199128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
1992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1993dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1995dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
1997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
1998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
1999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
2002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
2006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
2013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
2016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
2021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
2024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
2030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
2035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
2036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
2037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
2038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
2039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
2040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
2041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
2044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
2045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
2048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
2050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
2052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
2053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
2054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
2057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
2059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
2060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
2063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
2064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
2065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
2068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
2069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
2070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
2072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
2088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
2097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
2103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
2121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
2124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
2125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
2207119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
2208c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // and android:style is not set or is set to normal, and
2209c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // android:fontFamily is not set
2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
230022d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
23180162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
232222d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
232322d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
23689776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.blue);
23699776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.yellow);
23709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable top = getDrawable(R.drawable.red);
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
2422013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
2423013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
2424013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
2425013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2426013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
2427013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
2428013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2429013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
2430013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2431013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2432013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
2433013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2434013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2435013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
2436013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
2437013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
2438013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
2439013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
2440013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2443013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2444da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2445da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineWidth = 0;
2446da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineHeight = 0;
2447da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2448da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2449da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineWidth = textView.getLayout().getWidth();
2450da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineHeight = textView.getLayout().getHeight();
2451da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2455013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2459013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
2460da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2461da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2462da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getHeight() > singleLineHeight);
2463da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getWidth() < singleLineWidth);
2464da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2469013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2474013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2475da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2476da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2477da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineHeight, textView.getLayout().getHeight());
2478da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineWidth, textView.getLayout().getWidth());
2479da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
250772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
250872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
251072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
254172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
254272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
254372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
254472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
25549776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
25739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
25919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
26179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
26469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.red);
2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
2650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
26649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.red);
2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
2707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
2710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextAppearance() {
2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
2805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
2809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
2812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
2819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
2827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
2831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
2839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
2843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
2846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
2847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
2850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
2851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFadingEdgeStrength() {
286441f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewLeft = (MockTextView) mActivity.findViewById(
286541f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_left);
2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
286841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewLeft.setEllipsize(null);
2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on right side if the text aligns left
287441f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewLeft.getLeftFadingEdgeStrength(), 0.01f);
287541f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewLeft.getRightFadingEdgeStrength(), 0.01f);
2876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
287741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewRight = (MockTextView) mActivity.findViewById(
287841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_right);
2879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
288141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewRight.setEllipsize(null);
2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on left side if the text aligns right
288641f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewRight.getLeftFadingEdgeStrength(), 0.01f);
288741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewRight.getRightFadingEdgeStrength(), 0.01f);
2888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
288941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewCenter = (MockTextView) mActivity.findViewById(
289041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_center);
2891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
289341f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewCenter.setEllipsize(null);
2894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the text aligns center
289841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getLeftFadingEdgeStrength(), 0.01f);
289941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getRightFadingEdgeStrength(), 0.01f);
2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2902bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
2904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
2905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
2906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
2908bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2909bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2910bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2911bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
2912bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2918bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
2924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
2926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
2927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
2929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
2935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
29360162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
2940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
294472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float leftFadingEdgeStrength = textView.getLeftFadingEdgeStrength();
294572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float rightFadingEdgeStrength = textView.getRightFadingEdgeStrength();
294672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to continue
2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the left fading becomes thicker while the right fading becomes thiner
2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // as the text moves towards left
29500162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
2954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && rightFadingEdgeStrength > textView.getRightFadingEdgeStrength();
2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
2972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
2981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
2985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
2986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
2990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
2994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
2996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
2999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
3003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
3006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
3008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
3009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
3011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
3012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
3013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
3014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
3016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
3020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
3022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
3026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
3036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
3042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
3048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
3066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
3085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
3097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
3100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
318172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
318272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
318372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
318472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
318572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
318672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
318772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
31889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
318972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
319072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
319172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
319272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
319372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
319472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
319572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
319672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
319772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
319872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
319972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
320072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
320172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
320272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
320372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
320472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
320572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
320672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
320772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
320872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
320972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
321072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
321172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
321272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
321372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
321472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
321572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
321672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
321772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
321872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
321972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
322072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
322172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
322272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
322372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
322472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
322572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
322672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
322772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
322872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
322972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
323072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
323172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
323272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
323372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
323472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
323572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
323672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
323772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
323872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
323972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
324072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
324172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
324272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3243c873101a88e7ba584065de5e912508237378ca99Victoria Lease    public void testSetTextLong() {
3244f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader        mActivity.runOnUiThread(new Runnable() {
3245f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader            public void run() {
3246f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                final int MAX_COUNT = 1 << 21;
3247f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                char[] longText = new char[MAX_COUNT];
3248f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                for (int n = 0; n < MAX_COUNT; n++) {
3249f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                    longText[n] = 'm';
3250f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                }
3251f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                mTextView = findTextView(R.id.textview_text);
3252f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader                mTextView.setText(new String(longText));
3253f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader            }
3254f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader        });
3255f08da5962f03bcdf92fc5d34b7884a48c0aebab1Roozbeh Pournader        mInstrumentation.waitForIdleSync();
3256c873101a88e7ba584065de5e912508237378ca99Victoria Lease    }
3257c873101a88e7ba584065de5e912508237378ca99Victoria Lease
3258c873101a88e7ba584065de5e912508237378ca99Victoria Lease    @UiThreadTest
325972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
326072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
326172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
326272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
326372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
326472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
326572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
326672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
326772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
326872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
326972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
327072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
327172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
327272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
327372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
327472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
327572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
327672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
327772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
327872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
327972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
328072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
328172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
328272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
328372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
328472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
328572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
328672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
328772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
328872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
328972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
329072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
329172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
329272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
329372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
329472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
329572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
329672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
329772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
329872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
329972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
330072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
330172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
330272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
330372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
330472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
330572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
330672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
330772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
330872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
330972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
331072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
331172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
331272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
331372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
331472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
331572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
331672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
331772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
331872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
331972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3320afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
332172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
332272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
332372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
332472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
3325afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
3326afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
3327afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
3328afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
3329afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
3330afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
3331afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
3332afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
3333afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
333404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
333504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
333604d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
333704d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
333804d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
333904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
334004d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
334172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
334272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
334372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
334472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
334572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
334672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
334772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
334872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
334972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
335072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
335172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
335272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
335372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
335472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
335572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
335672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
335772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
335872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
335972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
336072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
336172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
336272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
336372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
336472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
336572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
336672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
336772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
336872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
336972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
337072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
337172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
337272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
337372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
337472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
337572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
337672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
337772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
337872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
337972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
338072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
338172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
338272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
338372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
338472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
338572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
338672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
33879776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
338872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
338972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
339072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
339172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
339272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
339372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
339472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
3395c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
339672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
339772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
339872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
339972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
340072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
340172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
340272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
340372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
340472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
340572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
340672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
340772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
340872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
340972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
341072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
341172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
341272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
341372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
341472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
341572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
341672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
341772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
341872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
341972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
342072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
342172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
342294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
342394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
3424c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
34252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
342694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
342794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
342894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
342994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
3430c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
343194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
343294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
34332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
343494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
343594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
34362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
343794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
343894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
34392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
344094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
344194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
34422a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
344394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
344494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
34452a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
344694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
344794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
34482a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
344994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
345094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
345194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
345294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
3453c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
345494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
345594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
34562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
345794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
345894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
34592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
346094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
346194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
34622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
346394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
346494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
34652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
346694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
346794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
34682a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
346994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
347094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
34712a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
347294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
347394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
34742a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
347594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
347694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
347794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
347894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
3479c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
348094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
348194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3482c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
348394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
348494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
348594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
348694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
34872a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
348894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
348994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
34902a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
349194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
349294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
34932a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
349494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
349594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
34962a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
349794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
349894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
34992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
350094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
350194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
35022a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
350394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
350494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
350594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
350694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
3507c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
350894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
350994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
35102a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
351194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
351294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
35132a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
351494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
351594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
35162a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
351794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
351894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
35192a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
352094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
352194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
35222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
352394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
352494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
35252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
352694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
352794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
35282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
352994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
353094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
353194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
353294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
3533c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
353494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
353594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3536c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
353794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
353894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
353994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
354094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
35412a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
354294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
354394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
35442a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
354594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
354694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
35472a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
354894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
354994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
35502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
355194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
355294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
35532a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
355494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
355594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
35562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
355794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
355894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
355994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
356094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
356194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
35622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
356394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
356494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
35652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
356694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
356794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
35682a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
356994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
357094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
35712a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
357294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
357394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
35742a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
357594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
357694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
35772a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
357894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
357994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
358094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
358194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
3582c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
3583c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
358494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
358594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
358694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
35872a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
358894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3589f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
359094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
3591f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
3592f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
3593f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
3594f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
35952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
359694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
359794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
3598dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3599dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
3600dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
36017fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3602dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
36037fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3604dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3605dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3606dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3607dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
3608dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3609dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3610dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
36117fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3612dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3613dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
36147fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
3615dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3616dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
36177fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
3618dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3619dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
36207fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
3621dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3622dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
36237fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
3624dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3625dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
36267fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
3627dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3628dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3629dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3630dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
3631dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3632dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
36337fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3634dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3635757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
3636dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
36377fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3638dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3639757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
3640757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3641757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3642757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
3643dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
36447fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3645dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3646dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
36477fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3648dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3649dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
36507fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3651dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3652dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
36537fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3654dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3655dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3656dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3657dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
3658dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
3659dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
3660dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3661dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
3662dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
3663dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3664dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
36657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
3666dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3667dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3668dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
3669dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
36707fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
3671dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3672dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
36737fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3674dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3675dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
36767fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
3677dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3678dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
36797fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
3680dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3681dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
36827fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
3683dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3684dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
36857fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
3686dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3687dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
3688dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3689dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3690dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
36917fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3692dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3693dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
36947fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3695dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3696dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
36977fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3698dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3699dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
37007fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3701dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3702dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
37037fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3704dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3705dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3706dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
3707dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
37084ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
3709dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3710dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
3711dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
3712dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3713dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
3714dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
37157fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
3716dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
37174f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // No reset when we remove the view
3718dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
37194f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
37204f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio
37214f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Reset is done when we add the view
37224f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Default text alignment is GRAVITY
37234f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        ll.addView(tv);
37247fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
3725dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
3726dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
3727b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
3728b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
3729b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
3730b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
3731b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
3732b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
3733b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
37344ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
3735b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3736b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
3737b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
3738b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
3739b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3740b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3741b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3742b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3743b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3744b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3745b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3746b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3747b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3748b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3749b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
3750b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
3751b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3752b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3753b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3754b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3755b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3756b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3757b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3758b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3759b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3760b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3761b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3762b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
3763b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
3764b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3765b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3766b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3767b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3768b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3769b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3770b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3771b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3772b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3773b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3774b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3775b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
3776b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
3777b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3778b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3779b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3780b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3781b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3782b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3783b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3784b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3785b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3786b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3787b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3788b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
3789b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3790b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3791b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3792b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3793b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3794b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3795b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3796b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3797b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3798b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3799b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3800b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3801b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
3802b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3803b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3804b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3805b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3806b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3807b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3808b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3809b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3810b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3811b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3812b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3813b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3814b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
3815b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3816b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
3817b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3818b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3819b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3820b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3821b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3822b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3823b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3824b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3825b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3826b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3827b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3828b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
3829b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3830b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
3831b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3832b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3833b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3834b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3835b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3836b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3837b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3838b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3839b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3840b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3841b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3842b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
3843b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3844b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
3845b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3846b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3847b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3848b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3849b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3850b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3851b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3852b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3853b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3854b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3855b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3856b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
3857b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
3858b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
3859b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
3860b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
3861b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
3862b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
3863b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
3864b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
3865b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
3866b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
3867b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
3868b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
3869b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
3870b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
38719776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    @UiThreadTest
38729776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    public void testDrawableResolution2() {
38739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int LEFT = 0;
38749776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int TOP = 1;
38759776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int RIGHT = 2;
38769776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int BOTTOM = 3;
38779776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
38784ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
38799776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
38809776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
38819776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
38829776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
38839776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
38849776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
38859776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
38869776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
38879776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
38889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
38899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
38909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
38919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
38929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
38939776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null);
38949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
38959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
38969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
38979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
38989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
38999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
39009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
39019776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
39039776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
39049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39059776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
39069776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
39079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
39089776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
39099776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
39109776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
39119776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
39129776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
39139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null);
39159776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
39169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
39189776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
39199776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
39209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
39219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
39229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_ltr);
39249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
39259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
39279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
39289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
39299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
39309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, getDrawable(R.drawable.icon_red), null);
39329776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
39339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
39359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
39369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
39379776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
39389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
39399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
39409776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null);
39429776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
39439776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39449776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
39459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
39469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
39479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
39489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
39499776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
39509776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
395172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
395272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
395372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
395572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
395672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
395772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
395872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
396072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
396172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
396272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
3965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
3968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
3974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
3977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
3983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
3984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
3987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
3988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
39919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return ((BitmapDrawable) getDrawable(resid)).getBitmap();
39929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
39939776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
39949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    private Drawable getDrawable(int resid) {
39959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return mActivity.getResources().getDrawable(resid);
3996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
3999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
4002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
4008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
4011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
4017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
4020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
4026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
4029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
4035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
4038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
4045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
4046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
4048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
4049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
4051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
4054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
4060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
4063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
4069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
4072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
4078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
4081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
4087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
4090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
4096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
4099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
4105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
4108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
4114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
4117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
4123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
4126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
4132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
4133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
4134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
4135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
4137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
4138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
4141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
4142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
4145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
4146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
4149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
4150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
4153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
4154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
4158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
4159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
4160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
4170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
4171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
4176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
4177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
4179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
4180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
4184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
4194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
4195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
4196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
4200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
4201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4203e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
4204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
4205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
4210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
4213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
4214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
4221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
4225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
4226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
4227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
4228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
4230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
4231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
4232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
4233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
4236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
4237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
4240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
4241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
4244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
4245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
4248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
4249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
4252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
4253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
4256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
4257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
4262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
4263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
4264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
4265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
4266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
4267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
4268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
4270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
4272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
4273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
4274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
4276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
4277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
4280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
4281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
4284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
4285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
4286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
4292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
4293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
4294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
4297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
4299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
4301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
4302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
4305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
4306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
4309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
4310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
4314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
4319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
4320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4323277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
4324277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    /**
4325277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     * A TextWatcher that converts the text to spaces whenever the text changes.
4326277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     */
4327277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    private static class ConvertToSpacesTextWatcher implements TextWatcher {
4328277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        boolean mChangingText;
4329277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
4330277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
4331277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
4332277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
4333277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
4334277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
4335277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void onTextChanged(CharSequence s, int start, int before, int count) {
4336277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
4337277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
4338277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
4339277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void afterTextChanged(Editable s) {
4340277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Avoid infinite recursion.
4341277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            if (mChangingText) {
4342277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                return;
4343277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
4344277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = true;
4345277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Create a string of s.length() spaces.
4346277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            StringBuilder builder = new StringBuilder(s.length());
4347277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            for (int i = 0; i < s.length(); i++) {
4348277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                builder.append(' ');
4349277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
4350277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            s.replace(0, s.length(), builder.toString());
4351277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = false;
4352277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
4353277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
4354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
4355