TextViewTest.java revision ba5ce949fafd36e5318108a261af06763651d6b7
1fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/*
2fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Copyright (C) 2008 The Android Open Source Project
3fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
4fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Licensed under the Apache License, Version 2.0 (the "License");
5fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * you may not use this file except in compliance with the License.
6fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * You may obtain a copy of the License at
7fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
8fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *      http://www.apache.org/licenses/LICENSE-2.0
9fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
10fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Unless required by applicable law or agreed to in writing, software
11fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * distributed under the License is distributed on an "AS IS" BASIS,
12fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * See the License for the specific language governing permissions and
14fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * limitations under the License.
15fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
16fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
17fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Supackage android.widget.cts;
18fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
19fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity;
20fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation;
21fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor;
22fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent;
232751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager;
24fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList;
25fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException;
260162547f44173f0604d8a80143c128d9892460a1Kristian Monsenimport android.cts.util.PollingCheck;
27d82745ff4a8b174f7be1258fd329dedc52ce58bbChenjie Luoimport android.cts.util.WidgetTestUtils;
28fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
29fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
30fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
31afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path;
32fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff;
33fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
34afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF;
35fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
36fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
37ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable;
38fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
415b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable;
42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
4372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
45ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.test.suitebuilder.annotation.SmallTest;
46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
47ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Html;
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;
54ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned;
55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
58afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
71afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
75ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan;
76fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
78c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournaderimport android.util.LocaleList;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
80ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
82afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo;
83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity;
84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent;
8532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu;
8632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.MenuItem;
87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View;
88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnCreateContextMenuListener;
89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnLongClickListener;
90afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup;
9132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo;
9272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection;
9372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo;
9472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText;
9572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest;
96c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection;
97c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText;
98bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout;
9962808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout;
100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller;
101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView;
102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType;
10372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener;
104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
105ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException;
106ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
108b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale;
109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
1134ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luopublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
114fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
1197375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "the width of the view. New devices have a much larger screen which "
1207375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "actually enables long strings to be displayed with no fading. "
1217375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "I have made this string longer to fix this case. If you are correcting "
1227375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "this text, I would love to see the kind of devices you guys now use!";
123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
12422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
127a3e5fa456a01c74b91a5d66981433db598bcc9a7Agatha Man        super("android.widget.cts", TextViewCtsActivity.class);
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
1344594468cc37000395ee2a000da08651e73e78508keunyoung        new PollingCheck() {
1354594468cc37000395ee2a000da08651e73e78508keunyoung            @Override
1364594468cc37000395ee2a000da08651e73e78508keunyoung                protected boolean check() {
1374594468cc37000395ee2a000da08651e73e78508keunyoung                return mActivity.hasWindowFocus();
1384594468cc37000395ee2a000da08651e73e78508keunyoung            }
1394594468cc37000395ee2a000da08651e73e78508keunyoung        }.run();
140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
14328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    /**
14428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     * Promotes the TextView to editable and places focus in it to allow simulated typing.
14528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     */
14628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    private void initTextViewForTyping() {
14728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mActivity.runOnUiThread(new Runnable() {
14828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            public void run() {
14928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView = findTextView(R.id.textview_text);
15028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
15128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setText("", BufferType.EDITABLE);
15228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.requestFocus();
15328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            }
15428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        });
15528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.waitForIdleSync();
15628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
15728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
3094bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
3124bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3344bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3404bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
459325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    public void testGetTextColor() {
460325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        // TODO: How to get a suitable TypedArray to test this method.
461325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
462325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        try {
463325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            TextView.getTextColor(mActivity, null, -1);
464325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            fail("There should be a NullPointerException thrown out.");
465325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        } catch (NullPointerException e) {
466325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        }
467325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    }
468325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
66253959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
66353959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
7249c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
7259c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
7339c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7409c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
79292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
79692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
80292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
80692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
81092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
816ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
817ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette
818ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // edge case where the behavior of Math.round() deviates from
819ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // FastMath.round(), requiring us to use an explicit 0 value
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
823ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(0, mTextView.getLineHeight());
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
826ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien    public void testSetElegantLineHeight() {
827ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mTextView = findTextView(R.id.textview_text);
828ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getPaint().isElegantTextHeight());
829ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
830ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
831ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setWidth(mTextView.getWidth() / 3);
832ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setPadding(1, 2, 3, 4);
833ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setGravity(Gravity.BOTTOM);
834ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
835ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
836ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
837ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
838ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        int oldHeight = mTextView.getHeight();
839ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
840ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
841ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setElegantTextHeight(true);
842ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
843ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
844ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
845ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
846ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getPaint().isElegantTextHeight());
847ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getHeight() > oldHeight);
848ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
849ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
850ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
851ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setElegantTextHeight(false);
852ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
853ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
854ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
855ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getPaint().isElegantTextHeight());
856ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getHeight() == oldHeight);
857ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien    }
858ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
88772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
90372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
90672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
90772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
91872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
93007b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
93107b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
93207b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
93307b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
93407b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
93507b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
93607b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
93707b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
93972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
989e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
993e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
997e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1001e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1007e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(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        assertEquals(1, mTextView.getSelectionStart());
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1305faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
1306faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testSetText_setsMovementMethodWhenLinksClickableAndTextContainsClickableSpans() {
1307faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
1308faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
1309faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1310faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
1311faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
1312faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNull("TextView.setText should not set movement method if linksClickable is false",
1313faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                mTextView.getMovementMethod());
1314faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1315faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
1316faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
1317faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.setText should set movement method if linksClickable is true " +
1318faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "and text contains clickable spans", mTextView.getMovementMethod());
1319faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
1320faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1321af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    public void testRemoveSelectionWithSelectionHandles() {
1322af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        initTextViewForTyping();
1323af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1324af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1325af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1326af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1327af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setTextIsSelectable(true);
1328af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setText("abcd", BufferType.EDITABLE);
1329af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1330af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1331af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1332af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1333af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Long click on the text selects all text and shows selection handlers. The view has an
1334af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // attribute layout_width="wrap_content", so clicked location (the center of the view)
1335af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // should be on the text.
1336af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        TouchUtils.longClickView(this, mTextView);
1337af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1338af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1339af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1340af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1341af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                Selection.removeSelection((Spannable) mTextView.getText());
1342af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1343af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1344af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1345af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Make sure that a crash doesn't happen with {@link Selection#removeSelection}.
1346af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1347af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    }
1348af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1349c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_insert() {
135028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
13515b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13525b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text.
13535b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
13545b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
13555b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
135628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The cursor is at the end of the text.
135728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13585b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13595b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo removes the typed string in one step.
13605b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13615b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
136228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13635b51f77b99861d48fec1c327252416f726b3b01aJames Cook
136428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo restores the text and cursor position.
13655b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
13665b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
136728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13685b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13695b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undoing the redo clears the text again.
13705b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13715b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
13725b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13735b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo when the undo stack is empty does nothing.
13745b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13755b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
13765b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
13775b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
13785b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
137928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
13805b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1381c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_delete() {
138228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
13835b51f77b99861d48fec1c327252416f726b3b01aJames Cook
138428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Simulate deleting text and undoing it.
138528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("xyz");
138628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
13875b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
13885b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
138928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The text was actually deleted.
139028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
139128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
139228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
139328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undo restores the typed string and cursor position in one step.
13945b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
139528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
139628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13975b51f77b99861d48fec1c327252416f726b3b01aJames Cook
139828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo removes the text in one step.
139928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
140028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
140128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
14025b51f77b99861d48fec1c327252416f726b3b01aJames Cook
140328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing the redo restores the text again.
140428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
140528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
140628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
140728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
140828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing again undoes the original typing.
14095b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
14105b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
141128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
14125b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
14135b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
14145b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
141528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
14165b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1417c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Initialize the text view for simulated IME typing. Must be called on UI thread.
1418c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private InputConnection initTextViewForSimulatedIme() {
1419c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView = findTextView(R.id.textview_text);
1420c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
1421c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("", BufferType.EDITABLE);
1422c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        return mTextView.onCreateInputConnection(new EditorInfo());
1423c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1424c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1425c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Simulates IME composing text behavior.
1426c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
1427c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1428c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText(text, 1);  // Leave cursor at end.
1429c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1430c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1431c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1432c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1433c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertLatin() {
1434c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1435c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1436c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
1437c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // such as "c" -> "ca" -> "cat" -> "cat ".
1438c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "c");
1439c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "ca");
1440c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1441c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The completion and space are added in the same batch.
1442c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1443c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("cat", 1);
1444c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText(" ", 1);
1445c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1446c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1447c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements undo in a single step.
1448c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1449c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1450c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1451c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1452c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1453c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertJapanese() {
1454c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1455c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1456c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
1457c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1458c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String NA = "\u306A";  // HIRAGANA LETTER NA
1459c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1460c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1461c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1462c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + NA);
1463c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1464c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The result may be a surrogate pair. The composition ends in the same batch.
1465c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1466c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
1467c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText("", 1);
1468c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1469c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1470c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements are a single undo step.
1471c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1472c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1473c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1474c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1475c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1476c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeCancel() {
1477c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1478c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1479c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1480c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Start typing a composition.
1481c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1482c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1483c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1484c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1485c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1486c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Cancel the composition.
1487c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "");
1488c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1489c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1490c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1491c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1492c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1493c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1494c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1495c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1496c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1497c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeEmptyBatch() {
1498c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1499c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1500c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1501c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Send an empty batch edit. This happens if the IME is hidden and shown.
1502c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1503c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1504c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1505c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1506c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1507c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1508c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1509c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1510c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1511c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1512c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_setText() {
1513277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
151428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1515c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Create two undo operations, an insert and a delete.
1516c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mInstrumentation.sendStringSync("xyz");
1517c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
1518277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1519277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1520c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook                // Calling setText() clears both undo operations, so undo doesn't happen.
1521277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1522277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1523277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
152428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1525277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Clearing text programmatically does not undo either.
1526277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("", BufferType.EDITABLE);
1527277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1528277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1529277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1530277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1531277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1532277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
153328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1534c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testRedo_setText() {
1535277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1536277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1537277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text. This creates an undo entry.
1538277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1539277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1540277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1541277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo the typing to create a redo entry.
1542277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1543277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1544277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Calling setText() clears the redo stack, so redo doesn't happen.
1545277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1546277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
1547277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
1548277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1549277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1550277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1551277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1552277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1553c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directAppend() {
1554277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
155528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1556277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1557277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1558277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1559277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1560277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Programmatically append some text.
1561277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.append("def");
1562277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abcdef", mTextView.getText().toString());
1563277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1564277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the append as a separate step.
1565277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1566277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1567277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1568277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1569277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1570277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1571277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1572277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1573277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1574277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1575277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1576c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directInsert() {
1577277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1578277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1579277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1580277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1581277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1582277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1583277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Directly modify the underlying Editable to insert some text.
1584277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // NOTE: This is a violation of the API of getText() which specifies that the
1585277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // returned object should not be modified. However, some apps do this anyway and
1586277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // the framework needs to handle it.
1587277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                Editable text = (Editable) mTextView.getText();
1588277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                text.insert(0, "def");
1589277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("defabc", mTextView.getText().toString());
1590277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1591277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the insert as a separate step.
1592277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1593277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1594277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1595277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1596277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1597277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1598277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1599277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1600277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1601277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1602277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1603c530472a02205f0b7d87f9f06140c56ca0849816James Cook    public void testUndo_noCursor() {
1604c530472a02205f0b7d87f9f06140c56ca0849816James Cook        initTextViewForTyping();
1605c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1606c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mActivity.runOnUiThread(new Runnable() {
1607c530472a02205f0b7d87f9f06140c56ca0849816James Cook            public void run() {
1608c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Append some text to create an undo operation. There is no cursor present.
1609c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.append("cat");
1610c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1611c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Place the cursor at the end of the text so the undo will have to change it.
1612c530472a02205f0b7d87f9f06140c56ca0849816James Cook                Selection.setSelection((Spannable) mTextView.getText(), 3);
1613c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1614c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Undo the append. This should not crash, despite not having a valid cursor
1615c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // position in the undo operation.
1616c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1617c530472a02205f0b7d87f9f06140c56ca0849816James Cook            }
1618c530472a02205f0b7d87f9f06140c56ca0849816James Cook        });
1619c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mInstrumentation.waitForIdleSync();
1620c530472a02205f0b7d87f9f06140c56ca0849816James Cook    }
1621c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1622c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_textWatcher() {
1623277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1624277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1625277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Add a TextWatcher that converts the text to spaces on each change.
1626277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1627277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1628277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1629277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1630277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1631277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1632277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // TextWatcher altered the text.
1633277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("   ", mTextView.getText().toString());
1634277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1635277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo reverses both changes in one step.
1636277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1637277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1638277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1639277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1640277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1641c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    }
1642c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1643c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    public void testUndo_textWatcherDirectAppend() {
1644c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        initTextViewForTyping();
1645c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1646c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        // Add a TextWatcher that converts the text to spaces on each change.
1647c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1648c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1649c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mActivity.runOnUiThread(new Runnable() {
1650c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            public void run() {
1651c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Programmatically append some text. The TextWatcher changes it to spaces.
1652c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.append("abc");
1653c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("   ", mTextView.getText().toString());
1654c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1655c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Undo reverses both changes in one step.
1656c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1657c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("", mTextView.getText().toString());
1658c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            }
1659c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        });
1660c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mInstrumentation.waitForIdleSync();
166128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
166228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1663c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_shortcuts() {
166428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
166528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
166628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Type some text.
166728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("abc");
16685b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
16695b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
16705b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Z triggers undo.
16715b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
16725b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        KeyEvent.META_CTRL_LEFT_ON);
1673277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
16745b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
16755b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16765b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Shift-Z triggers redo.
16775b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
16785b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
1679277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
168028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("abc", mTextView.getText().toString());
16815b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
16825b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
16835b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
16845b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
16855b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1686c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceState() {
168728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
16885b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16895b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text to create an undo operation.
16905b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
16915b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
16925b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
16935b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Parcel and unparcel the TextView.
16945b51f77b99861d48fec1c327252416f726b3b01aJames Cook                Parcelable state = mTextView.onSaveInstanceState();
16955b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onRestoreInstanceState(state);
16965b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
16975b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
16985b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
16995b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17005b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Delete a character to create a new undo operation.
17015b51f77b99861d48fec1c327252416f726b3b01aJames Cook        sendKeys(KeyEvent.KEYCODE_DEL);
17025b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
17035b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
17045b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("ab", mTextView.getText().toString());
17055b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17065b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the delete.
17075b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17085b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
17095b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17105b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the typing, which verifies that the original undo operation was parceled
17115b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // correctly.
17125b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17135b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
17145f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17155f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Parcel and unparcel the undo stack (which is empty but has been used and may
17165f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // contain other state).
17175f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
17185f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
17195f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
17205f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
17215f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
17225f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook    }
17235f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
1724c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceStateEmpty() {
17255f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        initTextViewForTyping();
17265f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17275f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Type and delete to create two new undo operations.
17285f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("a");
17295f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
17305f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
17315f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
17325f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Empty the undo stack then parcel and unparcel the TextView. While the undo
17335f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // stack contains no operations it may contain other state.
17345f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17355f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17365f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
17375f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
17385f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
17395f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
17405f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
17415f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17425f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Create two more undo operations.
17435f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("b");
17445f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
17455f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
17465f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
17475f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Verify undo still works.
17485f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17495f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("b", mTextView.getText().toString());
17505f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17515f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("", mTextView.getText().toString());
17525b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
17535b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
17545b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
17555b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
17565b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1757b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCopyAndPaste() {
1758b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1759b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1760b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1761b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1762b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1763b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1764b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Copy "bc".
1765b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1766b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
1767b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1768b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "bc" between "b" and "c".
1769b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
1770b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1771b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("abbccd", mTextView.getText().toString());
1772b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1773b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Select entire text and paste "bc".
1774b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1775b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1776b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("bc", mTextView.getText().toString());
1777b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1778b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1779b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1780b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1781b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
178249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCopyAndPaste_byKey() {
178349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
178449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
178549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
178649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
178749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
178849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
178949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
179049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
179149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
179249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
179349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
179449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Copy "bc"
179549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_COPY);
179649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
179749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
179849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
179949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Set cursor between 'b' and 'c'.
180049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
180149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
180249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
180349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
180449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
180549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
180649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("abbcc", mTextView.getText().toString());
180749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
180849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
180949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
181049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
181149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
181249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON);
181349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + copy doesn't perform copy.
181449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
181549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
181649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
181749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcabbcc", mTextView.getText().toString());
181849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
181949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
182049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
182149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
182249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + copy doesn't perform copy.
182349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
182449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
182549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
182649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcabbcc", mTextView.getText().toString());
182749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
182849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
182949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
183049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
183149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + copy doesn't perform copy.
183249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
183349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
183449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
183549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcbcabbcc", mTextView.getText().toString());
183649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
183749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
18388e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
183949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
184049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1841b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste() {
1842b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1843b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1844b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1845b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1846b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1847b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1848b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "bc".
1849b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1850b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1851b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1852b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1853b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "ad".
1854b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 2);
1855b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1856b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1857b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1858b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "ad".
1859b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1860b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1861b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1862b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1863b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1864b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1865b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
186649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCutAndPaste_byKey() {
186749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
186849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
186949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
187049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
187149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
187249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
187349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
187449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
187549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
187649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
187749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
187849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Cut "bc"
187949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_CUT);
188049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
188149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
188249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
188349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("a", mTextView.getText().toString());
188449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Move cursor to the head
188549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
188649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
188749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
188849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
188949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
189049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
189149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("bca", mTextView.getText().toString());
189249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
189349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
189449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
189549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
189649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
189749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON);
189849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + cut doesn't perform cut.
189949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
190049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
190149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
190249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
190349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
190449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + cut doesn't perform cut.
190549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
190649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
190749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
190849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
190949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
191049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + cut doesn't perform cut.
191149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
191249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
191349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
191449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
191549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
191649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1917b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) {
1918b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final Spannable spannable = (Spannable)textView.getText();
1919b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final int at = spannable.length() / 2;
1920b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        return spannable.getSpans(at, at, type).length > 0;
1921b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1922b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1923b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste_withAndWithoutStyle() {
1924b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1925b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1926b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1927b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("example", BufferType.EDITABLE);
1928b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1929b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1930b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Set URLSpan.
1931b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                final Spannable spannable = (Spannable) mTextView.getText();
1932b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0);
1933b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1934b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1935b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut entire text.
1936b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1937b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1938b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1939b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1940b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste without style.
1941b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText);
1942b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
1943b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text doesn't have URLSpan.
1944b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1945b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1946b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste with style.
1947b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1948b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1949b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
1950b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text has URLSpan.
1951b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1952b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1953b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1954b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1955b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1956b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
19584ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    public void testSaveInstanceState() {
1959baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // should save text when freezesText=true
19604ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView originalTextView = new TextView(mActivity);
19614ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
19624ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setText(text);
19634ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setFreezesText(true);  // needed to actually save state
19644ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        Parcelable state = originalTextView.onSaveInstanceState();
19654ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19664ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView restoredTextView = new TextView(mActivity);
19674ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        restoredTextView.onRestoreInstanceState(state);
19684ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(text, restoredTextView.getText().toString());
19694ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
19704ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19714ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
1972baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_whenFreezesTextIsFalse() {
19734ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
1974baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        { // should not save text when freezesText=false
1975baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for before saveInstanceState
1976baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView1 = new TextView(mActivity);
1977baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setFreezesText(false);
1978baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setText(text);
19794ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
1980baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for after saveInstanceState
1981baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView2 = new TextView(mActivity);
1982baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setFreezesText(false);
1983baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
1984baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
1985baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
1986baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            assertEquals("", textView2.getText().toString());
1987baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        }
1988baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
1989baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        { // should not save text even when textIsSelectable=true
1990baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for before saveInstanceState
1991baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView1 = new TextView(mActivity);
1992baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setFreezesText(false);
1993baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setTextIsSelectable(true);
1994baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setText(text);
1995baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
1996baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for after saveInstanceState
1997baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView2 = new TextView(mActivity);
1998baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setFreezesText(false);
1999baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setTextIsSelectable(true);
2000baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2001baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2002baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2003baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            assertEquals("", textView2.getText().toString());
2004baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        }
2005baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2006baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2007baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2008baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2009baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() {
2010baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2011baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2012baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2013baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(true);
2014baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2015baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2016baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2017baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2018baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(true);
2019baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2020baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2021baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2022baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(-1, textView2.getSelectionStart());
2023baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(-1, textView2.getSelectionEnd());
2024baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2025baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2026baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2027baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2028baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() {
2029baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2030baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2031baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2032baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(false);
2033baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setTextIsSelectable(true);
2034baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2035baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2);
2036baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2037baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2038baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2039baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(false);
2040baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setTextIsSelectable(true);
2041baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2042baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2043baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2044baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals("", textView2.getText().toString());
2045baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        //when textIsSelectable, selection start and end are initialized to 0
2046baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(0, textView2.getSelectionStart());
2047baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(0, textView2.getSelectionEnd());
2048baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2049baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2050baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2051baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2052baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_savesSelectionWhenExists() {
2053baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2054baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2055baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2056baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(true);
2057baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setTextIsSelectable(true);
2058baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2059baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2);
2060baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2061baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2062baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2063baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(true);
2064baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setTextIsSelectable(true);
2065baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2066baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2067baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2068baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart());
2069baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd());
20704ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
20714ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
20724ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
2090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
2097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
2100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
2103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
2117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
2122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
2123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
2124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
213153b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        final String errorText = "Oops! There is an error";
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
21419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable icon = getDrawable(R.drawable.failed);
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2161300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2171dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
217553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        assertEquals(errorText, mTextView.getError().toString());
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2177300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2178300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
2179300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
2180300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
2181300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
2182300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
2183300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
2184300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
2185300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
2186300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
2187dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2213dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
2216dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2219dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2233fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2241fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
2260fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        /* Cursor coordinates from getPrimaryHorizontal() may have a fractional
2261fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * component, while the result of getFocusedRect is in int coordinates.
2262fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * It's not practical for these to match exactly, so we compare that the
2263fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * integer components match - there can be a fractional pixel
2264fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * discrepancy, which should be okay for all practical applications. */
2265fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left);
2266fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right);
2267fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2268fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2269fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2270fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2271fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2272fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2273fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2274fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
2275fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2276fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2277fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2278fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2279fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2280fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2281fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left);
2282fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right);
2283fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2284fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2285fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2286fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
2287fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
2288fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2289fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
2290fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2291fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
2292fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2293fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2294fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2295fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2296fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2297fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2298fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
2299fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2300fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2301fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2302fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2303fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2304fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2305fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left);
2306fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right);
2307fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2308fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2309fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2310fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2311fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2312fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2313fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2314fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
2315fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2316fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2317fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2318fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2319fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2320fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
2321fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
2322fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
2323fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
2324fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2325fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
2326fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2328fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
241428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2416dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2418dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2426ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getIncludeFontPadding());
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
2445ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getIncludeFontPadding());
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
25452deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForSingleLine() {
25462deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        int textWidth = calculateTextWidth(LONG_TEXT);
25472deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25482deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeEnd = new TextView(getActivity());
25492deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
25502deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setMaxLines(1);
25512deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setWidth(textWidth >> 2);
25522deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setText(LONG_TEXT);
25532deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25542deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeNone = new TextView(getActivity());
25552deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setWidth(textWidth >> 2);
25562deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setText("a");
25572deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25582deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        final FrameLayout layout = new FrameLayout(mActivity);
25592deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
25602deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT,
25612deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT);
25622deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeEnd, layoutParams);
25632deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeNone, layoutParams);
25642deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.setLayoutParams(layoutParams);
25652deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25662deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        mActivity.runOnUiThread(new Runnable() {
25672deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            @Override
25682deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            public void run() {
25692deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                getActivity().setContentView(layout);
25702deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            }
25712deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        });
25722deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        getInstrumentation().waitForIdleSync();
25732deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25742deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        assertEquals("Ellipsized and non ellipsized single line texts should have the same " +
25752deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                        "baseline",
25762deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                tvEllipsizeEnd.getLayout().getLineBaseline(0),
25772deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                tvEllipsizeNone.getLayout().getLineBaseline(0));
25782deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    }
25792deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25802deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForMultiLine() {
25812deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        int textWidth = calculateTextWidth(LONG_TEXT);
25822deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25832deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeEnd = new TextView(getActivity());
25842deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
25852deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setMaxLines(2);
25862deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setWidth(textWidth >> 2);
25872deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setText(LONG_TEXT);
25882deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25892deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeNone = new TextView(getActivity());
25902deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setMaxLines(2);
25912deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setWidth(textWidth >> 2);
25922deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setText(LONG_TEXT);
25932deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25942deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        final FrameLayout layout = new FrameLayout(mActivity);
25952deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
25962deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT,
25972deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT);
25982deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
25992deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeEnd, layoutParams);
26002deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeNone, layoutParams);
26012deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.setLayoutParams(layoutParams);
26022deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26032deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        mActivity.runOnUiThread(new Runnable() {
26042deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            @Override
26052deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            public void run() {
26062deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                getActivity().setContentView(layout);
26072deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            }
26082deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        });
26092deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        getInstrumentation().waitForIdleSync();
26102deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26112deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        assertEquals(tvEllipsizeEnd.getLineCount(), tvEllipsizeNone.getLineCount());
26122deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) {
26132deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            assertEquals("Ellipsized and non ellipsized multi line texts should have the same " +
26142deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                            "baseline for line " + i,
26152deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                    tvEllipsizeEnd.getLayout().getLineBaseline(i),
26162deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                    tvEllipsizeNone.getLayout().getLineBaseline(i));
26172deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        }
26182deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    }
26192deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
2669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
2671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
2707119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
2708c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // and android:style is not set or is set to normal, and
2709c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // android:fontFamily is not set
2710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2779f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2780f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() {
2781f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2782f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2783f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2784f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2785f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" another text without URL");
2786f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2787f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2788f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2789f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2790f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL another text without URL", text.toString());
2791f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2792f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2793f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2794f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() {
2795f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2796f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2797f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2798f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2799f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2800f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2801f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2802f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2803f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2804f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2805f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2806f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2807f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenAutoLinkIsEnabled() {
2808f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2809f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2810f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2811f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2812f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2813f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2814f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2815f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2816f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2817f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2818f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2819f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2820f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2821f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2822f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2823f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() {
2824f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2825f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2826f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with URL http://android.com/before");
2827f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2828f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2829f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2830f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2831f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2832f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length);
2833f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("First URLSpan URL should be same",
2834f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/before");
2835f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2836f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[1].getURL(), "http://android.com");
2837f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text with URL http://android.com/before text with URL http://android.com",
2838f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                text.toString());
2839f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2840f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2841f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2842f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() {
2843f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2844f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2845f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2846f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2847f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with a url: http://android.com");
2848f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2849f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertNotNull("MovementMethod should not be null when text contains url",
2850f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod());
2851f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url",
2852f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod() instanceof LinkMovementMethod);
2853f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2854f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2855f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2856faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testAppend_setsMovementMethodWhenLinksClickableAndTextContainsClickableSpans() {
2857faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
2858faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
2859faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2860faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
2861faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append(text);
2862faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNull("TextView.append should not set movement method if linksClickable is false",
2863faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                mTextView.getMovementMethod());
2864faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2865faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText("");
2866faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
2867faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append(text);
2868faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.append should set movement method if linksClickable is true " +
2869faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "and text contains clickable spans", mTextView.getMovementMethod());
2870faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
2871faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2872faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
2873faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testAppend_setMovementMethodForExistingTextWhenLinksClickableIsTrueDuringAppend() {
2874faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
2875faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
2876faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
2877faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
2878faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2879faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
2880faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append("");
2881faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2882faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.append should set movement method if existing text contains " +
2883faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "links but new text does not", mTextView.getMovementMethod());
2884faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
2885faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2886faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
2887f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() {
2888f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2889f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2890f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2891f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2892f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(new SpannableString(" text with a url: http://android.com"));
2893f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2894f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2895f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2896f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2897f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2898f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2899f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2900f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2901f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2902f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() {
2903f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2904f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2905f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a partial url android.");
2906f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2907f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("com");
2908f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2909f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2910f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2911f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending to partial URL",
2912f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                1, urlSpans.length);
2913f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2914f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2915f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2916f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2917f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2918f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() {
2919f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2920f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2921f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a url http://android.com");
2922f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2923f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("/textview");
2924f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2925f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2926f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2927f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length);
2928f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the new URL",
2929f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/textview");
2930f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2931f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2932f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
2934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
2935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
2936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
2944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
2950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
295422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
29720162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
297622d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
297722d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
2978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
2982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
2985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
2989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
2993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
2996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
2997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
2998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
2999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
3002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
3003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
3004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
3006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
3007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
3008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
3012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
3013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
3015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
3016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
30229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.blue);
30239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.yellow);
30249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable top = getDrawable(R.drawable.red);
3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
3032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
3034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
3036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
3040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
3041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
3042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
3043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
3044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
3045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
3046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
3047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
3051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
3053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
3066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
3076013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
3077013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
3078013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
3079013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3080013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
3081013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
3082013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3083013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
3084013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3085013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3086013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
3087013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3088013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
3089013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
3090013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
3091013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
3092013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
3093013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
3094013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
3097013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
3098da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3099da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineWidth = 0;
3100da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineHeight = 0;
3101da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3102da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3103da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineWidth = textView.getLayout().getWidth();
3104da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineHeight = textView.getLayout().getHeight();
3105da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3109013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3113013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
3114da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3115da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3116da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getHeight() > singleLineHeight);
3117da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getWidth() < singleLineWidth);
3118da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3123013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
3128013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
3129da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3130da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3131da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineHeight, textView.getLayout().getHeight());
3132da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineWidth, textView.getLayout().getWidth());
3133da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3159636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public int calculateTextWidth(String text) {
3160636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3161636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3162636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        // Set the TextView width as the half of the whole text.
3163636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float[] widths = new float[text.length()];
3164636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView.getPaint().getTextWidths(text, widths);
3165636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float textfieldWidth = 0.0f;
3166636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int i = 0; i < text.length(); ++i) {
3167636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            textfieldWidth += widths[i];
3168636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3169636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        return (int)textfieldWidth;
3170636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3171636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3172636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3173636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
3174636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_frequencyNone() {
3175636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] BREAK_STRATEGIES = {
3176636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY,
3177636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_BALANCED };
3178636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3179636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3180636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3181636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int breakStrategy : BREAK_STRATEGIES) {
3182636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
3183636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
3184636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
3185636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3186636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
3187636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(breakStrategy);
3188636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3189636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
3190636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3191636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
3192636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3193636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3194636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3195636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3196636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3197636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3198636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any break strategy, hyphenation should not happen if
3199636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // HYPHENATION_FREQUENCY_NONE is specified.
3200636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3201636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3202636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3203636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3204636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3205636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3206636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3207636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
3208636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_breakStrategySimple() {
3209636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] HYPHENATION_FREQUENCIES = {
3210636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL,
3211636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NONE };
3212636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3213636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3214636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3215636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) {
3216636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
3217636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
3218636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
3219636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3220636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
3221636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
3222636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3223636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(hyphenationFrequency);
3224636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3225636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
3226636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3227636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3228636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3229636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3230636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3231636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3232636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any hyphenation frequency, hyphenation should not happen if
3233636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // BREAK_STRATEGY_SIMPLE is specified.
3234636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3235636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3236636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3237636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3238636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3239636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3240636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
324372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
324472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
324672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
327772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
327872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
327972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
328072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
32909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
3294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
3298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
3300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
3304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
3307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33099776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
3312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
3313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
3317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
3319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
3322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
3325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
3332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
3334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
3338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
3342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
3344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
3345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
3348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
3351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33539776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
3358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
3360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
3364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
3368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
3370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
3371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
3372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
3373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
3377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
3380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33829776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.red);
3383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
3384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
3385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
3386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
3395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
3398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
34009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.red);
3401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
3402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
3403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
3404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
3412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
3415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
3416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
3418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
3419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
3420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
3421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
3422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
3425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
3428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
3434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
3436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
3437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
3443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
3446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
3447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
3450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
3456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3458fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testDeprecatedSetTextAppearance() {
3459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
3472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
3480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
3484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3487fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testSetTextAppearance() {
3488fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3489fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3490fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_All);
3491fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3492fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3493fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3494fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3495fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3496fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3497fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3498fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3499fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3500fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Colors);
3501fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3502fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3503fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3504fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3505fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3506fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3507fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3508fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_NotColors);
3509fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3510fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3511fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3512fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Style);
3513fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(null, mTextView.getTypeface());
3514fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3515fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
3517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3520fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testAccessCompoundDrawableTint() {
3521fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3522fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3523fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        ColorStateList colors = ColorStateList.valueOf(Color.RED);
3524fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintList(colors);
3525fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR);
3526fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertSame(colors, mTextView.getCompoundDrawableTintList());
3527fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3528f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3529f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        // Ensure the tint is preserved across drawable changes.
3530f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawablesRelative(null, null, null, null);
3531f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3532f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3533f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3534f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawables(null, null, null, null);
3535f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3536f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3537f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3538f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr1 = new ColorDrawable(Color.RED);
3539f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr2 = new ColorDrawable(Color.GREEN);
3540f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr3 = new ColorDrawable(Color.BLUE);
3541f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr4 = new ColorDrawable(Color.YELLOW);
3542f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4);
3543f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3544f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3545fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3546fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
3548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
3549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
3551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
3660bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3661bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3662bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3663bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
3664bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3670bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
36880162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
36960f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir        // wait for left marquee to fully apply
36970162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
37000f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir                return textView.getLeftFadingEdgeStrength() > 0.99f;
3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
3768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
3802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
3804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
3823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
3919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
3924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
392772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
392872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
392972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
393072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
393272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
393372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
39349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
393572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
393672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
393872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
393972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
394072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
394272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
394372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
394472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
394672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
394772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
394972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
395072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
395172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
395372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
395472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
395672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
395772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
395972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
396072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
396272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
396472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
396672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
396772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
396872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
397072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
397172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
397372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
397472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
397672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
397772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
397872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
398072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
398172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
398272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
398372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
398572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
398672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
398772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
398872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3989d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    public void testAccessImeHintLocales() {
3990d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final TextView textView = new TextView(mActivity);
3991d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setText("", BufferType.EDITABLE);
3992d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setKeyListener(null);
3993d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setRawInputType(InputType.TYPE_CLASS_TEXT);
3994d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertNull(textView.getImeHintLocales());
3995d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
3996d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
3997d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
3998d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertNull(editorInfo.hintLocales);
3999d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
4000d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
4001d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US");
4002d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setImeHintLocales(localeList);
4003d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertEquals(localeList, textView.getImeHintLocales());
4004d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
4005d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
4006d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
4007d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertEquals(localeList, editorInfo.hintLocales);
4008d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
4009d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    }
4010d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
4011c873101a88e7ba584065de5e912508237378ca99Victoria Lease    @UiThreadTest
401272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
401372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
401472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
401572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
401672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
401772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
4018ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4019ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Update text and selection.
402072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
4021ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionStart = 0;
4022ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionEnd = 2;
402372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
402472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
402572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
4026ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(0, mTextView.getSelectionStart());
4027ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, mTextView.getSelectionEnd());
4028ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4029ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Use partialStartOffset and partialEndOffset
4030ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialStartOffset = 2;
4031ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialEndOffset = 3;
4032ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.text = "x";
4033ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionStart = 2;
4034ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionEnd = 3;
4035ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4036ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        mTextView.setExtractedText(et);
4037ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("text", mTextView.getText().toString());
4038ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, mTextView.getSelectionStart());
4039ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, mTextView.getSelectionEnd());
4040ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4041ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Update text with spans.
4042ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final SpannableString ss = new SpannableString("ex");
4043ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        ss.setSpan(new UnderlineSpan(), 0, 2, 0);
4044ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0);
4045ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4046ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.text = ss;
4047ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialStartOffset = 1;
4048ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialEndOffset = 3;
4049ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        mTextView.setExtractedText(et);
4050ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4051ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("text", mTextView.getText().toString());
4052ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final Editable editable = mTextView.getEditableText();
4053ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans(
4054ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi                0, editable.length(), UnderlineSpan.class);
4055ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, underlineSpans.length);
4056ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, editable.getSpanStart(underlineSpans[0]));
4057ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, editable.getSpanEnd(underlineSpans[0]));
4058ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4059ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final URLSpan[] urlSpans = mTextView.getEditableText().getSpans(
4060ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi                0, editable.length(), URLSpan.class);
4061ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, urlSpans.length);
4062ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, editable.getSpanStart(urlSpans[0]));
4063ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, editable.getSpanEnd(urlSpans[0]));
4064ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("ctstest://TextView/test", urlSpans[0].getURL());
406572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
406672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
406772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
406872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
406972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
407072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
407172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
407272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
407372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
407472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
407572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
407672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
407772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
407872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
407972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
408072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
408172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
408272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
408372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
408472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
408572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
408672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
408772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
408872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
408972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
409072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
409172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
409272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
409372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
409472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
409572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
409672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
409772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
409872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
409972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
410072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
410172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
410272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
410372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
410472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
410572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
410672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
410772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
410872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
410972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
411072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
411172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
411272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
411372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
411472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
411572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
4116afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
411772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
411872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
411972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
412072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
4121afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
4122afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
4123afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
4124afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
4125afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
4126afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
4127afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
4128afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
4129afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
413004d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
413104d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
413204d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
413304d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
413404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
413504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
413604d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
413772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
413872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
413972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
414072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
414172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
414272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
414372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
414472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
414572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
414672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
414772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
414872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
414972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
415072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
415172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
415272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
415372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
415472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
415572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
415672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
415772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
415872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
415972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
416072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
416172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
416272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
416372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
416472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
416572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
416672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
416772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
416872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
416972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
417172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
417272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
417372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
417572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
417672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
417772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
417872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
418072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
418172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
418272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
41839776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
418472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
418572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
418672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
418772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
418872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
418972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
419072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
4191c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
419272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
419372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
419472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
419572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
419672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
419772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
419872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
41990ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    public void testSelectAllJustAfterTap() {
42000ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Prepare an EditText with focus.
42010ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
42020ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
42030ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView = new EditText(mActivity);
42040ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mActivity.setContentView(mTextView);
42050ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42060ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertFalse(mTextView.didTouchFocusSelect());
42070ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setFocusable(true);
42080ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.requestFocus();
42090ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertTrue(mTextView.didTouchFocusSelect());
42100ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42110ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setText("Hello, World.", BufferType.SPANNABLE);
42120ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
42130ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
42140ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
42150ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42160ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Tap the view to show InsertPointController.
42170ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        TouchUtils.tapView(this, mTextView);
42180ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42190ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Execute SelectAll context menu.
42200ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
42210ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
42220ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.onTextContextMenuItem(android.R.id.selectAll);
42230ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
42240ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
42250ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
42260ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42270ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // The selection must be whole of the text contents.
42280ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(0, mTextView.getSelectionStart());
42290ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(mTextView.length(), mTextView.getSelectionEnd());
42300ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    }
42310ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
423272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
423372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
423472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
423572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
423672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
423772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
423872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
423972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
424072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
424172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
424272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
424372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
424472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
424572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
424672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
424772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
424872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
4249c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi
4250c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        // Tests for invalid arguments.
4251c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(request, null));
4252c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, outText));
4253c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, null));
425472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
425572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
425694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
425794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
4258c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
42592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
426094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
426194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
426294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
426394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
4264c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
426594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
426694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
42672a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
426894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
426994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
42702a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
427194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
427294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
42732a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
427494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
427594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
42762a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
427794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
427894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
42792a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
428094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
428194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
42822a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
428302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
428402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
428502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection());
428602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
428702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
428802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection());
428994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
429094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
429294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
4293c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
429494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
429594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
42962a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
429794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
42992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
430094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
430194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43022a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
430394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
430494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43052a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
430694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
430794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43082a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
430994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
431094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43112a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
431294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
431394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43142a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
431502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
431602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
431702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
431802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
431902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
432002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
432194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
432294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
432394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
432494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
4325c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
432694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
432794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4328c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
432994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
433094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
433194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
433494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
433794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
434094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
434194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43422a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
434394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
434494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43452a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
434694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
434794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43482a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
434902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
435002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
435102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
435202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
435302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
435402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
435594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
435694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
435794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
435894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
4359c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
436094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
436194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
43622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
436394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
436494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
436694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
436794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43682a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
436994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
437094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43712a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
437294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
437394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43742a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
437594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
437694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43772a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
437894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
437994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43802a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
438102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
438202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
438302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
438402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
438502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
438602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
438794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
438894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
438994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
439094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
4391c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
439294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
439394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4394c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
439594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
439694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
439794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
439894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
440094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
440194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
44022a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
440394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
440494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44052a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
440694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
440794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
44082a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
440994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
441094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
44112a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
441294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
441394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
44142a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
441594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
441602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
441702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
441802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
441902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
442002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
442102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
442294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
442394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
442494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
442594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
44262a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
442794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
442894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
44292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
443094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44322a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
443394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
44352a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
443694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
44382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
443994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
444094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
44412a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
444202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
444302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
444402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
444502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
444602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
444702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
444894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
444994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
445094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
445194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
4452c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
4453c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
445494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
445594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
445694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
445894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4459f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
446094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
4461f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
4462f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
4463f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
4464f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
44652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
446694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
446794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
446802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
446902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongLtr() {
447002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
447102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
447202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
447302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
447402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
447502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
447602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
447702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
447802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
447902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
448002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
448102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
448202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
448302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
448402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
448502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
448602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
448702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
448802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
448902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
449002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
449102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
449202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
449302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
449402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
449502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
449602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
449702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
449802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
449902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
450002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
450102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
450202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is LTR.
450302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
450402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
450502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
450602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
450702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
450802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
450902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
451002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
451102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
451202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
451302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
451402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
451502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
451602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
451702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
451802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
451902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongRtl() {
452002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
452102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
452202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
452302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
452402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
452502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
452602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
452702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
452802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
452902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
453002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
453102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
453202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
453302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
453402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
453502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
453602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
453702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
453802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
453902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
454002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
454102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
454202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
454302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
454402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
454502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
454602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
454702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
454802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
454902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
455002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
455102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
455202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is RTL.
455302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
455402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
455502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
455602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
455702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
455802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
455902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
456002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
456102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
456202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
456302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
456402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
456502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
456602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
456702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
4568c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    public void testTextLocales() {
4569c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        TextView tv = new TextView(mActivity);
4570c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.getDefault(), tv.getTextLocale());
4571c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.getDefault(), tv.getTextLocales());
4572c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4573c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocale(Locale.CHINESE);
4574c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.CHINESE, tv.getTextLocale());
4575c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales());
4576c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4577c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocales(LocaleList.forLanguageTags("en,ja"));
4578c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale());
4579c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales());
4580c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4581c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4582c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocale(null);
4583c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to null should throw");
4584c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4585c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4586c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4587c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4588c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4589c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(null);
4590c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locales to null should throw");
4591c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4592c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4593c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4594c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4595c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4596c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(new LocaleList());
4597c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to an empty list should throw");
4598c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4599c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4600c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4601c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    }
4602c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4603b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    public void testAllCapsLocalization() {
4604b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        String testString = "abcdefghijklmnopqrstuvwxyz";
4605b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4606b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        // The capitalized characters of "i" on Turkish and Azerbaijani are different from English.
4607b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        Locale[] testLocales = {
4608b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("az", "AZ"),
4609b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("tr", "TR"),
4610b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("en", "US"),
4611b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        };
4612b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4613b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        TextView tv = new TextView(mActivity);
4614b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        tv.setAllCaps(true);
4615b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        for (Locale locale: testLocales) {
4616b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            tv.setTextLocale(locale);
4617b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            assertEquals("Locale: " + locale.getDisplayName(),
4618b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         testString.toUpperCase(locale),
4619b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         tv.getTransformationMethod().getTransformation(testString, tv).toString());
4620b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        }
4621b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    }
4622b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4623dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4624dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
4625dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
46267fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4627dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
46287fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4629dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4630dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4631dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4632dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
4633dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4634dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4635dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
46367fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4637dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4638dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
46397fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
4640dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4641dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
46427fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
4643dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4644dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
46457fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
4646dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4647dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
46487fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
4649dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4650dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
46517fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
4652dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4653dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4654dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4655dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
4656dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4657dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
46587fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4659dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4660757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
4661dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
46627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4663dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4664757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
4665757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4666757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4667757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
4668dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
46697fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4670dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4671dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
46727fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4673dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4674dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
46757fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4676dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4677dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
46787fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4679dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4680dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4681dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4682dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
4683dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
4684dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4685dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4686dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4687dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
4688dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4689dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
46907fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4691dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4692dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4693dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
4694dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
46957fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
4696dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4697dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
46987fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4699dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4700dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
47017fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4702dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4703dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
47047fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4705dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4706dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
47077fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4708dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4709dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
47107fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4711dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4712dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
4713dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4714dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4715dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
47167fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4717dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4718dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
47197fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4720dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4721dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
47227fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4723dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4724dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
47257fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4726dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4727dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
47287fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4729dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4730dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4731dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4732dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
47334ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4734dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4735dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
4736dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
4737dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4738dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4739dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
47407fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4741dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
47424f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // No reset when we remove the view
4743dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
47444f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
47454f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio
47464f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Reset is done when we add the view
47474f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Default text alignment is GRAVITY
47484f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        ll.addView(tv);
47497fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4750dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4751dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4752b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
4753b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
4754b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
4755b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
4756b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
4757b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
4758b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
47594ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4760b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4761b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
4762b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
4763b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
4764b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4765b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4766b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4767b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4768b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4769b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4770b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4771b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4772b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4773b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4774b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
4775b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
4776b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4777b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4778b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4779b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4780b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4781b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4782b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4783b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4784b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4785b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4786b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4787b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
4788b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
4789b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4790b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4791b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4792b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4793b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4794b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4795b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4796b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4797b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4798b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4799b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4800b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
4801b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
4802b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4803b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4804b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4805b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4806b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4807b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4808b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4809b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4810b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4811b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4812b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4813b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
4814b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4815b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4816b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4817b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4818b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4819b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4820b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4821b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4822b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4823b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4824b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4825b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4826b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
4827b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4828b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4829b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4830b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4831b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4832b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4833b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4834b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4835b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4836b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4837b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4838b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4839b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
4840b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4841b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
4842b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4843b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4844b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4845b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4846b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4847b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4848b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4849b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4850b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4851b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4852b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4853b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
4854b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4855b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
4856b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4857b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4858b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4859b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4860b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4861b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4862b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4863b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4864b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4865b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4866b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4867b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
4868b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4869b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4870b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4871b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4872b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4873b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4874b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4875b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4876b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4877b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4878b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4879b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4880b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4881b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
4882b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4883b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4884b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4885b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4886b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4887b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4888b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4889b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4890b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4891b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4892b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4893b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4894b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
4895b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
48969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    @UiThreadTest
48979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    public void testDrawableResolution2() {
48989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int LEFT = 0;
48999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int TOP = 1;
49009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int RIGHT = 2;
49019776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int BOTTOM = 3;
49029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49034ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
49049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49059776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
49069776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
49079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
49089776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49099776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49109776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49119776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49129776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
49149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
49159776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
49179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49189776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null);
49199776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
49229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
49289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49329776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
49359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
49369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49379776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
49389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null);
49409776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49429776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49439776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49449776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_ltr);
49499776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49509776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49519776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
49529776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49539776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49549776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49559776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49569776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, getDrawable(R.drawable.icon_red), null);
49579776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49589776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49599776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49619776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49629776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49639776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49659776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49669776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null);
49679776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49689776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49699776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49719776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49729776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49749776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
49759776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
4976e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetBreakStrategy() {
4977e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
4978e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
49792751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        final PackageManager pm = getInstrumentation().getTargetContext().getPackageManager();
49802751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka
4981d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for
49822751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // TextView except for Android Wear. The default value for Android Wear is
49832751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // BREAK_STRATEGY_BALANCED.
49842751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
49852751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // Android Wear
49862751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
49872751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        } else {
49882751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // All other form factor.
49892751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
49902751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        }
4991e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4992e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
4993e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy());
4994e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4995e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
4996e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
4997e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4998e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
4999e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
5000d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5001d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        EditText et = new EditText(mActivity);
5002d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5003d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for
5004d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // EditText.
5005d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
5006d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5007d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
5008d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
5009d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5010d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
5011d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy());
5012d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5013d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
5014d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy());
5015e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
5016e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5017e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetHyphenationFrequency() {
5018e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
5019e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5020d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
5021e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5022e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
5023e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency());
5024e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5025e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL);
5026e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
5027e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5028e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
5029e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency());
5030e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
5031e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
503232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomSelectionActionModeCallback() {
503332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        final String text = "abcde";
503432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
503532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
503632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView = new EditText(mActivity);
503732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mActivity.setContentView(mTextView);
503832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setText(text, BufferType.SPANNABLE);
503932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setTextIsSelectable(true);
504032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.requestFocus();
504132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setSelected(true);
504232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
504332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
504432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
504532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
504632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
504732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomSelectionActionModeCallback());
504832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
504932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackBlockActionMode = new MockActionModeCallback(false);
505032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackBlockActionMode);
505132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackBlockActionMode,
505232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.getCustomSelectionActionModeCallback());
505332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
505432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
505532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
505632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
505732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
505832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
505932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
50608e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
506132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
506232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
506332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
506432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
506532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
506632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackBlockActionMode.getCreateCount());
506732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
506832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
506932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
507032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
507132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
507232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
507332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
507432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
507532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
507632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was blocked.
507732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(0, callbackBlockActionMode.getDestroyCount());
507832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
507932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Overwrite callback.
508032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackStartActionMode = new MockActionModeCallback(true);
508132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackStartActionMode);
508232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackStartActionMode, mTextView.getCustomSelectionActionModeCallback());
508332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
508432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
508532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
508632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
508732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
508832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
508932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
50908e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
509132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
509232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
509332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
509432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
509532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
509632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
509732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getCreateCount());
509832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
509932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
510032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
510132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
510232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
510332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
510432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
510532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
510632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
510732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was started
510832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getDestroyCount());
510932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
511032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
511132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomInseltionActionMode() {
511232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        initTextViewForTyping();
511332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
511432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomInsertionActionModeCallback());
511532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
511632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callback = new MockActionModeCallback(false);
511732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomInsertionActionModeCallback(callback);
511832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callback, mTextView.getCustomInsertionActionModeCallback());
511932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // TODO(Bug: 22033189): Tests the set callback is actually used.
512032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
512132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
512232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    private static class MockActionModeCallback implements ActionMode.Callback {
512332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mCreateCount = 0;
512432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mDestroyCount = 0;
512532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private final boolean mAllowToStartActionMode;
512632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
512732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public MockActionModeCallback(boolean allowToStartActionMode) {
512832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mAllowToStartActionMode = allowToStartActionMode;
512932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
513032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
513132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getCreateCount() {
513232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mCreateCount;
513332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
513432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
513532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getDestroyCount() {
513632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mDestroyCount;
513732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
513832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
513932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
514032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
514132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
514232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
514332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
514432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
514532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public void onDestroyActionMode(ActionMode mode) {
514632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mDestroyCount++;
514732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
514832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
514932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
515032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
515132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mCreateCount++;
515232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mAllowToStartActionMode;
515332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
515432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
515532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
515632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
515732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
515832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
515932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    };
516032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
516172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
516272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
516372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
516472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
516572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
516672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
516772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
516872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
516972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
517072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
517172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
517272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
517372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
5174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
5175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
5178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
5184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
5187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
5193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
5194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
5197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
5198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
52019776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return ((BitmapDrawable) getDrawable(resid)).getBitmap();
52029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
52039776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
52049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    private Drawable getDrawable(int resid) {
52059776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return mActivity.getResources().getDrawable(resid);
5206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
5209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
5212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
5218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
5221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
5227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
5230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
5236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
5239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
5245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
5248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
5255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
5256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
5258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
5259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
5261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
5264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
5270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
5273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
5279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
5282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
5288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
5291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
5297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
5300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
5306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
5309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
5315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
5318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
5324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
5327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
5333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
5336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
5342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
5344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
5345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
5347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
5351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
5352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
5355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
5356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
5359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
5360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
5363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
5364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
5368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
5370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
5372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
5376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
5377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
5380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
5381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
5385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
5386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
5389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
5390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
5394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
5403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
5404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
5406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
5410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
5411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5413e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
5414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
5415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
5419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
5428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
5429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
5431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
5435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
5436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
5437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
5438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
5440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
5441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
5442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
5443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
5446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
5447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
5450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
5451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
5454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
5455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
5458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
5459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
5463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
5466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
5467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
5472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
5473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
5474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
5475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
5476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
5477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
5478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
5480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
5482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
5483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
5484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
5486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
5487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
5490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
5491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
5494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
5495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
5496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
5501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
5502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
5503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
5504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
5505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
5506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
5507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
5509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
5511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
5512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
5513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
5515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
5516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
5519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
5520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
5524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
5527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
5528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
5529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
5530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5533277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5534277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    /**
5535277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     * A TextWatcher that converts the text to spaces whenever the text changes.
5536277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     */
5537277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    private static class ConvertToSpacesTextWatcher implements TextWatcher {
5538277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        boolean mChangingText;
5539277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5540277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5541277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5542277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5543277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5544277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5545277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void onTextChanged(CharSequence s, int start, int before, int count) {
5546277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5547277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5548277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5549277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void afterTextChanged(Editable s) {
5550277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Avoid infinite recursion.
5551277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            if (mChangingText) {
5552277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                return;
5553277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5554277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = true;
5555277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Create a string of s.length() spaces.
5556277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            StringBuilder builder = new StringBuilder(s.length());
5557277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            for (int i = 0; i < s.length(); i++) {
5558277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                builder.append(' ');
5559277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5560277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            s.replace(0, s.length(), builder.toString());
5561277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = false;
5562277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5563277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
5564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
5565