TextViewTest.java revision 265b3d21959154e9a6ce0fdd888249f3699b7bdd
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;
265bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinirimport android.cts.util.KeyEventUtil;
270162547f44173f0604d8a80143c128d9892460a1Kristian Monsenimport android.cts.util.PollingCheck;
28d82745ff4a8b174f7be1258fd329dedc52ce58bbChenjie Luoimport android.cts.util.WidgetTestUtils;
29fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
30fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
31fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
32afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path;
33fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff;
34fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
35afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF;
36fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
37fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
38ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
41fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
42265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList;
435b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
4572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
4798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.test.suitebuilder.annotation.MediumTest;
48ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.test.suitebuilder.annotation.SmallTest;
49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter;
51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType;
52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout;
53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection;
54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable;
55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString;
56ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned;
57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
60afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher;
61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
73afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize;
74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
7698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan;
77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
78ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
82ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode;
83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
84afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo;
85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity;
86fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent;
8732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu;
8832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.MenuItem;
89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View;
90fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnCreateContextMenuListener;
91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnLongClickListener;
92afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup;
9332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo;
9472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection;
9572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo;
9672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText;
9772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest;
98c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection;
99c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText;
100bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout;
10162808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout;
102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller;
103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView;
104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType;
10572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener;
106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
107ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException;
108ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
110b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale;
111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
1154ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luopublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
116fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
1217375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "the width of the view. New devices have a much larger screen which "
1227375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "actually enables long strings to be displayed with no fading. "
1237375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "I have made this string longer to fix this case. If you are correcting "
1247375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "this text, I would love to see the kind of devices you guys now use!";
125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
12622d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
1275bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir    private KeyEventUtil mKeyEventUtil;
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
130a3e5fa456a01c74b91a5d66981433db598bcc9a7Agatha Man        super("android.widget.cts", TextViewCtsActivity.class);
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
1374594468cc37000395ee2a000da08651e73e78508keunyoung        new PollingCheck() {
1384594468cc37000395ee2a000da08651e73e78508keunyoung            @Override
1394594468cc37000395ee2a000da08651e73e78508keunyoung                protected boolean check() {
1404594468cc37000395ee2a000da08651e73e78508keunyoung                return mActivity.hasWindowFocus();
1414594468cc37000395ee2a000da08651e73e78508keunyoung            }
1424594468cc37000395ee2a000da08651e73e78508keunyoung        }.run();
143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
1445bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil = new KeyEventUtil(mInstrumentation);
145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
14728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    /**
14828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     * Promotes the TextView to editable and places focus in it to allow simulated typing.
14928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     */
15028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    private void initTextViewForTyping() {
15128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mActivity.runOnUiThread(new Runnable() {
15228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            public void run() {
15328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView = findTextView(R.id.textview_text);
15428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
15528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setText("", BufferType.EDITABLE);
15628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.requestFocus();
15728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            }
15828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        });
15928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.waitForIdleSync();
16028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
16128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
3134bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
3164bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3384bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3444bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
463325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    public void testGetTextColor() {
464325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        // TODO: How to get a suitable TypedArray to test this method.
465325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
466325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        try {
467325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            TextView.getTextColor(mActivity, null, -1);
468325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            fail("There should be a NullPointerException thrown out.");
469325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        } catch (NullPointerException e) {
470325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        }
471325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    }
472325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
66653959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
66753959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
7289c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
7299c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
7379c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7449c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
79692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
80092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
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 = -1.4f;
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
81092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
81492e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
820ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
821ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette
822ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // edge case where the behavior of Math.round() deviates from
823ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // FastMath.round(), requiring us to use an explicit 0 value
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
827ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(0, mTextView.getLineHeight());
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
830ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien    public void testSetElegantLineHeight() {
831ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mTextView = findTextView(R.id.textview_text);
832ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getPaint().isElegantTextHeight());
833ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
834ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
835ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setWidth(mTextView.getWidth() / 3);
836ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setPadding(1, 2, 3, 4);
837ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setGravity(Gravity.BOTTOM);
838ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
839ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
840ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
841ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
842ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        int oldHeight = mTextView.getHeight();
843ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
844ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
845ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setElegantTextHeight(true);
846ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
847ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
848ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
849ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
850ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getPaint().isElegantTextHeight());
851ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getHeight() > oldHeight);
852ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
853ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mActivity.runOnUiThread(new Runnable() {
854ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            public void run() {
855ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien                mTextView.setElegantTextHeight(false);
856ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien            }
857ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        });
858ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        mInstrumentation.waitForIdleSync();
859ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getPaint().isElegantTextHeight());
860ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getHeight() == oldHeight);
861ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien    }
862ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien
863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
89172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
90772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
91072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
91172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
92272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
93407b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
93507b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
93607b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
93707b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
93807b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
93907b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
94007b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
94107b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
94372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
993e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
997e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1001e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1005e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1011e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
130998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir    @MediumTest
131098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir    public void testSetText_updatesHeightAfterRemovingImageSpan() {
131198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // Height calculation had problems when TextView had width: match_parent
131298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT;
131398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final Spannable text = new SpannableString("some text");
131498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final int spanHeight = 100;
131598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
131698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // prepare TextView, width: MATCH_PARENT
131798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        TextView textView = new TextView(getActivity());
131898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        textView.setSingleLine(true);
131998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2);
132098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        textView.setPadding(0, 0, 0, 0);
132198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        textView.setIncludeFontPadding(false);
132298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        textView.setText(text);
132398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final FrameLayout layout = new FrameLayout(mActivity);
132498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth,
132598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                ViewGroup.LayoutParams.WRAP_CONTENT);
132698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        layout.addView(textView, layoutParams);
132798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        layout.setLayoutParams(layoutParams);
132898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        mActivity.runOnUiThread(new Runnable() {
132998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            @Override
133098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            public void run() {
133198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                getActivity().setContentView(layout);
133298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            }
133398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        });
133498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        getInstrumentation().waitForIdleSync();
133598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
133698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // measure height of text with no span
133798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final int heightWithoutSpan = textView.getHeight();
133898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        assertTrue("Text height should be smaller than span height",
133998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                heightWithoutSpan < spanHeight);
134098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
134198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // add ImageSpan to text
134298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery);
134398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        drawable.setBounds(0, 0, spanHeight, spanHeight);
134498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        ImageSpan span = new ImageSpan(drawable);
134598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
134698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        mActivity.runOnUiThread(new Runnable() {
134798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            @Override
134898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            public void run() {
134998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                textView.setText(text);
135098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            }
135198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        });
135298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        mInstrumentation.waitForIdleSync();
135398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
135498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // measure height with span
135598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final int heightWithSpan = textView.getHeight();
135698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        assertTrue("Text height should be greater or equal than span height",
135798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                heightWithSpan >= spanHeight);
135898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
135998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        // remove the span
136098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        text.removeSpan(span);
136198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        mActivity.runOnUiThread(new Runnable() {
136298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            @Override
136398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            public void run() {
136498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                textView.setText(text);
136598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir            }
136698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        });
136798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        mInstrumentation.waitForIdleSync();
136898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
136998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        final int heightAfterRemoveSpan = textView.getHeight();
137098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir        assertEquals("Text height should be same after removing the span",
137198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir                heightWithoutSpan, heightAfterRemoveSpan);
137298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir    }
137398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir
1374af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    public void testRemoveSelectionWithSelectionHandles() {
1375af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        initTextViewForTyping();
1376af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1377af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1378af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1379af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1380af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setTextIsSelectable(true);
1381af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setText("abcd", BufferType.EDITABLE);
1382af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1383af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1384af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1385af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1386af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Long click on the text selects all text and shows selection handlers. The view has an
1387af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // attribute layout_width="wrap_content", so clicked location (the center of the view)
1388af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // should be on the text.
1389af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        TouchUtils.longClickView(this, mTextView);
1390af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1391af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1392af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1393af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1394af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                Selection.removeSelection((Spannable) mTextView.getText());
1395af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1396af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1397af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1398af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Make sure that a crash doesn't happen with {@link Selection#removeSelection}.
1399af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1400af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    }
1401af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1402c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_insert() {
140328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
14045b51f77b99861d48fec1c327252416f726b3b01aJames Cook
14055b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text.
14065bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
14075b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
14085b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
140928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The cursor is at the end of the text.
141028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
14115b51f77b99861d48fec1c327252416f726b3b01aJames Cook
14125b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo removes the typed string in one step.
14135b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
14145b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
141528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
14165b51f77b99861d48fec1c327252416f726b3b01aJames Cook
141728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo restores the text and cursor position.
14185b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
14195b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
142028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
14215b51f77b99861d48fec1c327252416f726b3b01aJames Cook
14225b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undoing the redo clears the text again.
14235b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
14245b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
14255b51f77b99861d48fec1c327252416f726b3b01aJames Cook
14265b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo when the undo stack is empty does nothing.
14275b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
14285b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
14295b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
14305b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
14315b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
143228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
14335b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1434c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_delete() {
143528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
14365b51f77b99861d48fec1c327252416f726b3b01aJames Cook
143728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Simulate deleting text and undoing it.
14385bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "xyz");
14395bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL,
14405bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir                KeyEvent.KEYCODE_DEL);
14415b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
14425b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
144328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The text was actually deleted.
144428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
144528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
144628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
144728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undo restores the typed string and cursor position in one step.
14485b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
144928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
145028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
14515b51f77b99861d48fec1c327252416f726b3b01aJames Cook
145228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo removes the text in one step.
145328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
145428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
145528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
14565b51f77b99861d48fec1c327252416f726b3b01aJames Cook
145728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing the redo restores the text again.
145828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
145928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
146028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
146128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
146228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing again undoes the original typing.
14635b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
14645b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
146528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
14665b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
14675b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
14685b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
146928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
14705b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1471c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Initialize the text view for simulated IME typing. Must be called on UI thread.
1472c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private InputConnection initTextViewForSimulatedIme() {
1473c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView = findTextView(R.id.textview_text);
1474c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
1475c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("", BufferType.EDITABLE);
1476c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        return mTextView.onCreateInputConnection(new EditorInfo());
1477c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1478c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1479c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Simulates IME composing text behavior.
1480c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
1481c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1482c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText(text, 1);  // Leave cursor at end.
1483c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1484c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1485c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1486c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1487c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertLatin() {
1488c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1489c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1490c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
1491c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // such as "c" -> "ca" -> "cat" -> "cat ".
1492c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "c");
1493c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "ca");
1494c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1495c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The completion and space are added in the same batch.
1496c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1497c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("cat", 1);
1498c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText(" ", 1);
1499c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1500c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1501c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements undo in a single step.
1502c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1503c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1504c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1505c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1506c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1507c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertJapanese() {
1508c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1509c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1510c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
1511c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1512c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String NA = "\u306A";  // HIRAGANA LETTER NA
1513c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1514c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1515c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1516c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + NA);
1517c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1518c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The result may be a surrogate pair. The composition ends in the same batch.
1519c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1520c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
1521c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText("", 1);
1522c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1523c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1524c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements are a single undo step.
1525c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1526c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1527c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1528c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1529c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1530c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeCancel() {
1531c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1532c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1533c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1534c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Start typing a composition.
1535c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1536c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1537c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1538c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1539c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1540c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Cancel the composition.
1541c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "");
1542c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1543c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1544c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1545c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1546c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1547c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1548c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1549c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1550c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1551c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeEmptyBatch() {
1552c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1553c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1554c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1555c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Send an empty batch edit. This happens if the IME is hidden and shown.
1556c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1557c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1558c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1559c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1560c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1561c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1562c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1563c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1564c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1565c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1566c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_setText() {
1567277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
156828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1569c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Create two undo operations, an insert and a delete.
15705bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "xyz");
15715bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL,
15725bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir                KeyEvent.KEYCODE_DEL);
1573277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1574277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1575c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook                // Calling setText() clears both undo operations, so undo doesn't happen.
1576277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1577277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1578277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
157928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1580277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Clearing text programmatically does not undo either.
1581277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("", BufferType.EDITABLE);
1582277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1583277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1584277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1585277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1586277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1587277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
158828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1589c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testRedo_setText() {
1590277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1591277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1592277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text. This creates an undo entry.
15935bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
1594277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1595277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1596277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo the typing to create a redo entry.
1597277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1598277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1599277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Calling setText() clears the redo stack, so redo doesn't happen.
1600277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1601277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
1602277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
1603277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1604277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1605277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1606277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1607277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1608c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directAppend() {
1609277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
161028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1611277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
16125bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
1613277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1614277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1615277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Programmatically append some text.
1616277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.append("def");
1617277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abcdef", mTextView.getText().toString());
1618277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1619277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the append as a separate step.
1620277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1621277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1622277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1623277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1624277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1625277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1626277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1627277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1628277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1629277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1630277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1631c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directInsert() {
1632277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1633277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1634277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
16355bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
1636277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1637277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1638277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Directly modify the underlying Editable to insert some text.
1639277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // NOTE: This is a violation of the API of getText() which specifies that the
1640277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // returned object should not be modified. However, some apps do this anyway and
1641277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // the framework needs to handle it.
1642277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                Editable text = (Editable) mTextView.getText();
1643277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                text.insert(0, "def");
1644277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("defabc", mTextView.getText().toString());
1645277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1646277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the insert as a separate step.
1647277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1648277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1649277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1650277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1651277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1652277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1653277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1654277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1655277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1656277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1657277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1658c530472a02205f0b7d87f9f06140c56ca0849816James Cook    public void testUndo_noCursor() {
1659c530472a02205f0b7d87f9f06140c56ca0849816James Cook        initTextViewForTyping();
1660c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1661c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mActivity.runOnUiThread(new Runnable() {
1662c530472a02205f0b7d87f9f06140c56ca0849816James Cook            public void run() {
1663c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Append some text to create an undo operation. There is no cursor present.
1664c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.append("cat");
1665c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1666c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Place the cursor at the end of the text so the undo will have to change it.
1667c530472a02205f0b7d87f9f06140c56ca0849816James Cook                Selection.setSelection((Spannable) mTextView.getText(), 3);
1668c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1669c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Undo the append. This should not crash, despite not having a valid cursor
1670c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // position in the undo operation.
1671c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1672c530472a02205f0b7d87f9f06140c56ca0849816James Cook            }
1673c530472a02205f0b7d87f9f06140c56ca0849816James Cook        });
1674c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mInstrumentation.waitForIdleSync();
1675c530472a02205f0b7d87f9f06140c56ca0849816James Cook    }
1676c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1677c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_textWatcher() {
1678277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1679277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1680277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Add a TextWatcher that converts the text to spaces on each change.
1681277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1682277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1683277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
16845bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
1685277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1686277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1687277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // TextWatcher altered the text.
1688277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("   ", mTextView.getText().toString());
1689277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1690277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo reverses both changes in one step.
1691277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1692277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1693277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1694277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1695277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1696c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    }
1697c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1698c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    public void testUndo_textWatcherDirectAppend() {
1699c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        initTextViewForTyping();
1700c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1701c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        // Add a TextWatcher that converts the text to spaces on each change.
1702c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1703c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1704c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mActivity.runOnUiThread(new Runnable() {
1705c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            public void run() {
1706c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Programmatically append some text. The TextWatcher changes it to spaces.
1707c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.append("abc");
1708c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("   ", mTextView.getText().toString());
1709c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1710c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Undo reverses both changes in one step.
1711c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1712c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("", mTextView.getText().toString());
1713c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            }
1714c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        });
1715c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mInstrumentation.waitForIdleSync();
171628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
171728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1718c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_shortcuts() {
171928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
172028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
172128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Type some text.
17225bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
17235b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
17245b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
17255b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Z triggers undo.
17265b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
17275b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        KeyEvent.META_CTRL_LEFT_ON);
1728277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
17295b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
17305b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17315b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Shift-Z triggers redo.
17325b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
17335b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
1734277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
173528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("abc", mTextView.getText().toString());
17365b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
17375b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
17385b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
17395b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
17405b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1741c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceState() {
174228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
17435b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17445b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text to create an undo operation.
17455bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "abc");
17465b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
17475b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
17485b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Parcel and unparcel the TextView.
17495b51f77b99861d48fec1c327252416f726b3b01aJames Cook                Parcelable state = mTextView.onSaveInstanceState();
17505b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onRestoreInstanceState(state);
17515b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
17525b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
17535b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
17545b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17555b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Delete a character to create a new undo operation.
17565bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL);
17575b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
17585b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
17595b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("ab", mTextView.getText().toString());
17605b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17615b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the delete.
17625b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17635b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
17645b51f77b99861d48fec1c327252416f726b3b01aJames Cook
17655b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the typing, which verifies that the original undo operation was parceled
17665b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // correctly.
17675b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17685b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
17695f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17705f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Parcel and unparcel the undo stack (which is empty but has been used and may
17715f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // contain other state).
17725f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
17735f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
17745f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
17755f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
17765f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
17775f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook    }
17785f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
1779c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceStateEmpty() {
17805f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        initTextViewForTyping();
17815f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17825f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Type and delete to create two new undo operations.
17835bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "a");
17845bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL);
17855f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
17865f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
17875f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Empty the undo stack then parcel and unparcel the TextView. While the undo
17885f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // stack contains no operations it may contain other state.
17895f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17905f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17915f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
17925f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
17935f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
17945f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
17955f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
17965f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17975f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Create two more undo operations.
17985bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendString(mTextView, "b");
17995bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir        mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL);
18005f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
18015f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
18025f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Verify undo still works.
18035f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
18045f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("b", mTextView.getText().toString());
18055f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
18065f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("", mTextView.getText().toString());
18075b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
18085b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
18095b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
18105b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
18115b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1812b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCopyAndPaste() {
1813b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1814b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1815b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1816b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1817b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1818b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1819b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Copy "bc".
1820b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1821b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
1822b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1823b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "bc" between "b" and "c".
1824b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
1825b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1826b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("abbccd", mTextView.getText().toString());
1827b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1828b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Select entire text and paste "bc".
1829b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1830b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1831b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("bc", mTextView.getText().toString());
1832b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1833b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1834b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1835b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1836b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
183749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCopyAndPaste_byKey() {
183849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
183949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
184049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
184149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
184249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
184349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
184449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
184549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
184649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
184749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
184849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
184949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Copy "bc"
185049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_COPY);
185149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
185249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
185349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
185449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Set cursor between 'b' and 'c'.
185549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
185649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
185749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
185849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
185949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
186049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
186149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("abbcc", mTextView.getText().toString());
186249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
186349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
186449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
186549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
186649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
186749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON);
186849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + copy doesn't perform copy.
186949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
187049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
187149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
187249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcabbcc", mTextView.getText().toString());
187349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
187449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
187549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
187649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
187749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + copy doesn't perform copy.
187849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
187949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
188049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
188149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcabbcc", mTextView.getText().toString());
188249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
188349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
188449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
188549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
188649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + copy doesn't perform copy.
188749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
188849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
188949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
189049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcbcabbcc", mTextView.getText().toString());
189149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
189249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
18938e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
189449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
189549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1896b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste() {
1897b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1898b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1899b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1900b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1901b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1902b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1903b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "bc".
1904b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1905b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1906b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1907b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1908b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "ad".
1909b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 2);
1910b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1911b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1912b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1913b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "ad".
1914b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1915b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1916b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1917b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1918b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1919b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1920b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
192149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCutAndPaste_byKey() {
192249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
192349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
192449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
192549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
192649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
192749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
192849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
192949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
193049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
193149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
193249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
193349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Cut "bc"
193449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_CUT);
193549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
193649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
193749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
193849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("a", mTextView.getText().toString());
193949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Move cursor to the head
194049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
194149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
194249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
194349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
194449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
194549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
194649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("bca", mTextView.getText().toString());
194749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
194849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
194949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
195049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
195149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
195249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON);
195349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + cut doesn't perform cut.
195449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
195549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
195649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
195749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
195849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
195949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + cut doesn't perform cut.
196049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
196149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
196249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
196349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
196449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
196549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + cut doesn't perform cut.
196649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
196749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
196849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
196949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
197049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
197149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1972b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) {
1973b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final Spannable spannable = (Spannable)textView.getText();
1974b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final int at = spannable.length() / 2;
1975b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        return spannable.getSpans(at, at, type).length > 0;
1976b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1977b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1978b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste_withAndWithoutStyle() {
1979b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1980b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1981b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1982b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("example", BufferType.EDITABLE);
1983b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1984b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1985b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Set URLSpan.
1986b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                final Spannable spannable = (Spannable) mTextView.getText();
1987b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0);
1988b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1989b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1990b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut entire text.
1991b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1992b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1993b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1994b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1995b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste without style.
1996b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText);
1997b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
1998b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text doesn't have URLSpan.
1999b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
2000b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
2001b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste with style.
2002b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
2003b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
2004b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
2005b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text has URLSpan.
2006b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
2007b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
2008b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
2009b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
2010b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
2011b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
20134ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    public void testSaveInstanceState() {
2014baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // should save text when freezesText=true
20154ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView originalTextView = new TextView(mActivity);
20164ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
20174ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setText(text);
20184ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setFreezesText(true);  // needed to actually save state
20194ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        Parcelable state = originalTextView.onSaveInstanceState();
20204ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
20214ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView restoredTextView = new TextView(mActivity);
20224ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        restoredTextView.onRestoreInstanceState(state);
20234ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(text, restoredTextView.getText().toString());
20244ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
20254ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
20264ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
2027baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_whenFreezesTextIsFalse() {
20284ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
2029baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        { // should not save text when freezesText=false
2030baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for before saveInstanceState
2031baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView1 = new TextView(mActivity);
2032baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setFreezesText(false);
2033baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setText(text);
20344ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
2035baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for after saveInstanceState
2036baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView2 = new TextView(mActivity);
2037baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setFreezesText(false);
2038baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2039baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2040baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2041baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            assertEquals("", textView2.getText().toString());
2042baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        }
2043baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2044baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        { // should not save text even when textIsSelectable=true
2045baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for before saveInstanceState
2046baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView1 = new TextView(mActivity);
2047baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setFreezesText(false);
2048baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setTextIsSelectable(true);
2049baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView1.setText(text);
2050baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2051baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            // prepare TextView for after saveInstanceState
2052baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            TextView textView2 = new TextView(mActivity);
2053baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setFreezesText(false);
2054baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.setTextIsSelectable(true);
2055baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2056baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2057baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2058baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir            assertEquals("", textView2.getText().toString());
2059baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        }
2060baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2061baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2062baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2063baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2064baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() {
2065baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2066baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2067baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2068baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(true);
2069baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2070baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2071baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2072baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2073baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(true);
2074baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2075baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2076baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2077baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(-1, textView2.getSelectionStart());
2078baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(-1, textView2.getSelectionEnd());
2079baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2080baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2081baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2082baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2083baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() {
2084baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2085baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2086baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2087baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(false);
2088baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setTextIsSelectable(true);
2089baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2090baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2);
2091baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2092baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2093baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2094baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(false);
2095baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setTextIsSelectable(true);
2096baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2097baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2098baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2099baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals("", textView2.getText().toString());
2100baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        //when textIsSelectable, selection start and end are initialized to 0
2101baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(0, textView2.getSelectionStart());
2102baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(0, textView2.getSelectionEnd());
2103baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    }
2104baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2105baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @UiThreadTest
2106baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    @SmallTest
2107baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir    public void testOnSaveInstanceState_savesSelectionWhenExists() {
2108baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        final String text = "This is a string";
2109baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for before saveInstanceState
2110baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView1 = new TextView(mActivity);
2111baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setFreezesText(true);
2112baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setTextIsSelectable(true);
2113baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView1.setText(text);
2114baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2);
2115baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2116baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        // prepare TextView for after saveInstanceState
2117baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        TextView textView2 = new TextView(mActivity);
2118baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setFreezesText(true);
2119baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.setTextIsSelectable(true);
2120baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2121baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        textView2.onRestoreInstanceState(textView1.onSaveInstanceState());
2122baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir
2123baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart());
2124baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir        assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd());
21254ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
21264ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
21274ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
218653b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        final String errorText = "Oops! There is an error";
2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
21969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable icon = getDrawable(R.drawable.failed);
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2216300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2226dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
223053b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        assertEquals(errorText, mTextView.getError().toString());
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2232300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2233300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
2234300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
2235300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
2236300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
2237300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
2238300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
2239300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
2240300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
2241300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
2242dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2268dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
2271dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2274dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2288fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2296fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
2315fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        /* Cursor coordinates from getPrimaryHorizontal() may have a fractional
2316fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * component, while the result of getFocusedRect is in int coordinates.
2317fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * It's not practical for these to match exactly, so we compare that the
2318fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * integer components match - there can be a fractional pixel
2319fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * discrepancy, which should be okay for all practical applications. */
2320fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left);
2321fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right);
2322fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2323fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2324fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2325fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2326fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2327fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2328fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2329fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
2330fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2331fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2332fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2333fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2334fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2335fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2336fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left);
2337fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right);
2338fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2339fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2340fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2341fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
2342fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
2343fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2344fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
2345fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2346fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
2347fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2348fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2349fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2350fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2351fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2352fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2353fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
2354fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2355fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2356fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2357fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2358fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2359fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2360fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left);
2361fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right);
2362fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2363fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2364fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2365fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2366fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2367fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2368fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2369fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
2370fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2371fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2372fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2373fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2374fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2375fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
2376fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
2377fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
2378fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
2379fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2380fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
2381fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2383fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
2445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
246928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2471dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2473dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2481ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertTrue(mTextView.getIncludeFontPadding());
2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
2500ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien        assertFalse(mTextView.getIncludeFontPadding());
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
26002deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForSingleLine() {
26012deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        int textWidth = calculateTextWidth(LONG_TEXT);
26022deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26032deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeEnd = new TextView(getActivity());
26042deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
26052deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setMaxLines(1);
26062deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setWidth(textWidth >> 2);
26072deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setText(LONG_TEXT);
26082deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26092deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeNone = new TextView(getActivity());
26102deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setWidth(textWidth >> 2);
26112deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setText("a");
26122deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26132deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        final FrameLayout layout = new FrameLayout(mActivity);
26142deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
26152deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT,
26162deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT);
26172deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeEnd, layoutParams);
26182deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeNone, layoutParams);
26192deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.setLayoutParams(layoutParams);
26202deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26212deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        mActivity.runOnUiThread(new Runnable() {
26222deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            @Override
26232deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            public void run() {
26242deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                getActivity().setContentView(layout);
26252deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            }
26262deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        });
26272deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        getInstrumentation().waitForIdleSync();
26282deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26292deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        assertEquals("Ellipsized and non ellipsized single line texts should have the same " +
26302deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                        "baseline",
26312deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                tvEllipsizeEnd.getLayout().getLineBaseline(0),
26322deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                tvEllipsizeNone.getLayout().getLineBaseline(0));
26332deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    }
26342deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26352deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForMultiLine() {
26362deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        int textWidth = calculateTextWidth(LONG_TEXT);
26372deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26382deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeEnd = new TextView(getActivity());
26392deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setEllipsize(TruncateAt.END);
26402deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setMaxLines(2);
26412deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setWidth(textWidth >> 2);
26422deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeEnd.setText(LONG_TEXT);
26432deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26442deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        TextView tvEllipsizeNone = new TextView(getActivity());
26452deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setMaxLines(2);
26462deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setWidth(textWidth >> 2);
26472deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        tvEllipsizeNone.setText(LONG_TEXT);
26482deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26492deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        final FrameLayout layout = new FrameLayout(mActivity);
26502deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
26512deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT,
26522deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                ViewGroup.LayoutParams.MATCH_PARENT);
26532deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26542deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeEnd, layoutParams);
26552deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.addView(tvEllipsizeNone, layoutParams);
26562deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        layout.setLayoutParams(layoutParams);
26572deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26582deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        mActivity.runOnUiThread(new Runnable() {
26592deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            @Override
26602deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            public void run() {
26612deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                getActivity().setContentView(layout);
26622deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            }
26632deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        });
26642deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        getInstrumentation().waitForIdleSync();
26652deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
26662deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        assertEquals(tvEllipsizeEnd.getLineCount(), tvEllipsizeNone.getLineCount());
26672deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) {
26682deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir            assertEquals("Ellipsized and non ellipsized multi line texts should have the same " +
26692deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                            "baseline for line " + i,
26702deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                    tvEllipsizeEnd.getLayout().getLineBaseline(i),
26712deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir                    tvEllipsizeNone.getLayout().getLineBaseline(i));
26722deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir        }
26732deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir    }
26742deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
2707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
2708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
2709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
2762119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
2763c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // and android:style is not set or is set to normal, and
2764c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // android:fontFamily is not set
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
2779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
2804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
2809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
2813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
2820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
2827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
2829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2834f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2835f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() {
2836f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2837f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2838f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2839f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2840f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" another text without URL");
2841f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2842f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2843f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2844f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2845f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL another text without URL", text.toString());
2846f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2847f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2848f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2849f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() {
2850f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2851f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2852f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2853f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2854f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2855f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2856f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2857f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2858f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2859f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2860f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2861f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2862f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenAutoLinkIsEnabled() {
2863f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2864f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2865f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2866f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2867f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2868f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2869f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2870f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2871f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2872f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2873f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2874f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2875f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2876f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2877f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2878f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() {
2879f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2880f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2881f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with URL http://android.com/before");
2882f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2883f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2884f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2885f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2886f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2887f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length);
2888f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("First URLSpan URL should be same",
2889f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/before");
2890f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2891f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[1].getURL(), "http://android.com");
2892f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text with URL http://android.com/before text with URL http://android.com",
2893f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                text.toString());
2894f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2895f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2896f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2897f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() {
2898f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2899f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2900f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2901f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2902f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with a url: http://android.com");
2903f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2904f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertNotNull("MovementMethod should not be null when text contains url",
2905f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod());
2906f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url",
2907f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod() instanceof LinkMovementMethod);
2908f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2909f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2910f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2911f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() {
2912f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2913f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2914f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2915f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2916f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(new SpannableString(" text with a url: http://android.com"));
2917f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2918f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2919f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2920f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2921f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2922f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2923f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2924f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2925f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2926f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() {
2927f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2928f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2929f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a partial url android.");
2930f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2931f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("com");
2932f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2933f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2934f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2935f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending to partial URL",
2936f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                1, urlSpans.length);
2937f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2938f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2939f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2940f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2941f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2942f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() {
2943f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2944f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2945f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a url http://android.com");
2946f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2947f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("/textview");
2948f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2949f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2950f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2951f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length);
2952f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the new URL",
2953f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/textview");
2954f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2955f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2956f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
2972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
297822d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
2979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
2988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
2991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
29960162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
300022d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
300122d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
3002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
3006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
3009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
3013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
3020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
3022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
3023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
3026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
3030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
3031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
3032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
3036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
3037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
3039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
3040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
3042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
3043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
30469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.blue);
30479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.yellow);
30489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable top = getDrawable(R.drawable.red);
3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
3051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
3066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
3084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
3085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
3086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
3087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
3088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
3097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
3100013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
3101013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
3102013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
3103013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3104013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
3105013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
3106013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3107013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
3108013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3109013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3110013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
3111013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
3112013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
3113013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
3114013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
3115013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
3116013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
3117013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
3118013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
3121013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
3122da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3123da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineWidth = 0;
3124da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineHeight = 0;
3125da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3126da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3127da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineWidth = textView.getLayout().getWidth();
3128da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineHeight = textView.getLayout().getHeight();
3129da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3133013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3137013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
3138da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3139da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3140da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getHeight() > singleLineHeight);
3141da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getWidth() < singleLineWidth);
3142da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3147013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
3152013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
3153da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
3154da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
3155da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineHeight, textView.getLayout().getHeight());
3156da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineWidth, textView.getLayout().getWidth());
3157da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
3181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3183636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public int calculateTextWidth(String text) {
3184636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3185636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3186636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        // Set the TextView width as the half of the whole text.
3187636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float[] widths = new float[text.length()];
3188636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView.getPaint().getTextWidths(text, widths);
3189636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float textfieldWidth = 0.0f;
3190636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int i = 0; i < text.length(); ++i) {
3191636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            textfieldWidth += widths[i];
3192636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3193636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        return (int)textfieldWidth;
3194636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3195636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3196636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3197636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
3198636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_frequencyNone() {
3199636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] BREAK_STRATEGIES = {
3200636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY,
3201636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_BALANCED };
3202636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3203636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3204636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3205636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int breakStrategy : BREAK_STRATEGIES) {
3206636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
3207636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
3208636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
3209636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3210636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
3211636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(breakStrategy);
3212636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3213636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
3214636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3215636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
3216636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3217636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3218636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3219636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3220636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3221636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3222636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any break strategy, hyphenation should not happen if
3223636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // HYPHENATION_FREQUENCY_NONE is specified.
3224636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3225636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3226636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3227636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3228636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3229636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3230636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3231636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
3232636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_breakStrategySimple() {
3233636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] HYPHENATION_FREQUENCIES = {
3234636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL,
3235636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NONE };
3236636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3237636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3238636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3239636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) {
3240636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
3241636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
3242636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
3243636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3244636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
3245636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
3246636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3247636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(hyphenationFrequency);
3248636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3249636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
3250636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3251636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3252636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3253636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3254636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3255636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3256636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any hyphenation frequency, hyphenation should not happen if
3257636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // BREAK_STRATEGY_SIMPLE is specified.
3258636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3259636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3260636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3261636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3262636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3263636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3264636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
326772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
326872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
327072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
3280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
3296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
330172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
330272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
330372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
330472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
3305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
3309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
3312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
3317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
3318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
3322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
3324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
3328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
3331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
3336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
3337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
3341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
3343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
3346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
3349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33519776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
3356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
3358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
3362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
3366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
3368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
3369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
3372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
3375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
33779776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
3382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
3384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
3388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
3392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
3394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
3395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
3396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
3397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
3401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
3404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
34069776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.red);
3407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
3408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
3409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
3410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
3419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
3422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
34249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.red);
3425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
3426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
3427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
3428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
3436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
3439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
3440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
3442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
3443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
3444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
3446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
3458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
3460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
3470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
3471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
3472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
3480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3482fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testDeprecatedSetTextAppearance() {
3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
3496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
3504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
3508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
3509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3511fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testSetTextAppearance() {
3512fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3513fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3514fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_All);
3515fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3516fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3517fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3518fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3519fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3520fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3521fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3522fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3523fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3524fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Colors);
3525fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3526fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3527fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3528fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3529fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3530fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3531fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3532fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_NotColors);
3533fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3534fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3535fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3536fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Style);
3537fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(null, mTextView.getTypeface());
3538fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3539fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
3541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3544fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testAccessCompoundDrawableTint() {
3545fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3546fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3547fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        ColorStateList colors = ColorStateList.valueOf(Color.RED);
3548fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintList(colors);
3549fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR);
3550fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertSame(colors, mTextView.getCompoundDrawableTintList());
3551fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3552f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3553f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        // Ensure the tint is preserved across drawable changes.
3554f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawablesRelative(null, null, null, null);
3555f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3556f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3557f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3558f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawables(null, null, null, null);
3559f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3560f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3561f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette
3562f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr1 = new ColorDrawable(Color.RED);
3563f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr2 = new ColorDrawable(Color.GREEN);
3564f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr3 = new ColorDrawable(Color.BLUE);
3565f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        ColorDrawable dr4 = new ColorDrawable(Color.YELLOW);
3566f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4);
3567f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertSame(colors, mTextView.getCompoundDrawableTintList());
3568f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3569fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3570fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
3663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
3684bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3685bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3686bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3687bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
3688bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3694bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
37120162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
37200f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir        // wait for left marquee to fully apply
37210162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
37240f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir                return textView.getLeftFadingEdgeStrength() > 0.99f;
3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
3769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
3773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
3778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
3779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
3781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
3783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
3784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
3818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
3820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
3826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
3855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
3943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
3948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
395172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
395272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
395372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
395472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
395672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
395772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
39589776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
395972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
396072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
396272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
396472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
396672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
396772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
396872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
397072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
397172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
397372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
397472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
397572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
397772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
397872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
398072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
398172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
398372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
398472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
398672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
398772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
398872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
399072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
399172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
399272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
399372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
399472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
399572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
399672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
399772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
399872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
399972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
400072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
400172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
400272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
400372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
400472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
400572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
400672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
400772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
400872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
400972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
401072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
401172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
401272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
4013d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    public void testAccessImeHintLocales() {
4014d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final TextView textView = new TextView(mActivity);
4015d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setText("", BufferType.EDITABLE);
4016d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setKeyListener(null);
4017d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setRawInputType(InputType.TYPE_CLASS_TEXT);
4018d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertNull(textView.getImeHintLocales());
4019d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
4020d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
4021d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
4022d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertNull(editorInfo.hintLocales);
4023d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
4024d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
4025d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US");
4026d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setImeHintLocales(localeList);
4027d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertEquals(localeList, textView.getImeHintLocales());
4028d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
4029d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
4030d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
4031d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertEquals(localeList, editorInfo.hintLocales);
4032d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
4033d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    }
4034d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
4035c873101a88e7ba584065de5e912508237378ca99Victoria Lease    @UiThreadTest
403672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
403772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
403872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
403972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
404072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
404172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
4042ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4043ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Update text and selection.
404472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
4045ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionStart = 0;
4046ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionEnd = 2;
404772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
404872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
404972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
4050ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(0, mTextView.getSelectionStart());
4051ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, mTextView.getSelectionEnd());
4052ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4053ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Use partialStartOffset and partialEndOffset
4054ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialStartOffset = 2;
4055ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialEndOffset = 3;
4056ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.text = "x";
4057ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionStart = 2;
4058ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.selectionEnd = 3;
4059ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4060ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        mTextView.setExtractedText(et);
4061ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("text", mTextView.getText().toString());
4062ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, mTextView.getSelectionStart());
4063ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, mTextView.getSelectionEnd());
4064ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4065ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        // Update text with spans.
4066ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final SpannableString ss = new SpannableString("ex");
4067ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        ss.setSpan(new UnderlineSpan(), 0, 2, 0);
4068ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0);
4069ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4070ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.text = ss;
4071ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialStartOffset = 1;
4072ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        et.partialEndOffset = 3;
4073ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        mTextView.setExtractedText(et);
4074ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4075ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("text", mTextView.getText().toString());
4076ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final Editable editable = mTextView.getEditableText();
4077ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans(
4078ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi                0, editable.length(), UnderlineSpan.class);
4079ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, underlineSpans.length);
4080ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, editable.getSpanStart(underlineSpans[0]));
4081ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, editable.getSpanEnd(underlineSpans[0]));
4082ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi
4083ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        final URLSpan[] urlSpans = mTextView.getEditableText().getSpans(
4084ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi                0, editable.length(), URLSpan.class);
4085ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(1, urlSpans.length);
4086ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(2, editable.getSpanStart(urlSpans[0]));
4087ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals(3, editable.getSpanEnd(urlSpans[0]));
4088ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi        assertEquals("ctstest://TextView/test", urlSpans[0].getURL());
408972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
409072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
409172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
409272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
409372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
409472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
409572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
409672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
409772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
409872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
409972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
410072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
410172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
410272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
410372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
410472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
410572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
410672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
410772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
410872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
410972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
411072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
411172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
411272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
411372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
411472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
411572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
411672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
411772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
411872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
411972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
412072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
412172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
412272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
412372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
412472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
412572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
412672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
412772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
412872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
412972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
413072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
413172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
413272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
413372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
413472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
413572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
413672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
413772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
413872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
413972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
4140afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
414172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
414272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
414372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
414472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
4145afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
4146afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
4147afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
4148afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
4149afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
4150afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
4151afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
4152afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
4153afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
415404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
415504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
415604d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
415704d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
415804d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
415904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
416004d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
416172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
416272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
416372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
416472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
416572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
416672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
416772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
416872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
416972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
417172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
417272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
417372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
417472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
417672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
417772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
417872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
417972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
418072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
418172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
418272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
418372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
418472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
418572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
418672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
418772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
418872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
418972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
419072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
419172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
419272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
419372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
419472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
419572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
419672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
419772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
419872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
419972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
420072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
420172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
420272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
420372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
420472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
420572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
420672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
42079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
420872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
420972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
421072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
421172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
421272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
421372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
421472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
4215c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
421672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
421772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
421872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
421972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
422072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
422172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
422272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
42230ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    public void testSelectAllJustAfterTap() {
42240ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Prepare an EditText with focus.
42250ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
42260ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
42270ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView = new EditText(mActivity);
42280ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mActivity.setContentView(mTextView);
42290ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42300ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertFalse(mTextView.didTouchFocusSelect());
42310ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setFocusable(true);
42320ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.requestFocus();
42330ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertTrue(mTextView.didTouchFocusSelect());
42340ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42350ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setText("Hello, World.", BufferType.SPANNABLE);
42360ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
42370ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
42380ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
42390ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42400ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Tap the view to show InsertPointController.
42410ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        TouchUtils.tapView(this, mTextView);
42420ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42430ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Execute SelectAll context menu.
42440ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
42450ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
42460ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.onTextContextMenuItem(android.R.id.selectAll);
42470ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
42480ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
42490ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
42500ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
42510ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // The selection must be whole of the text contents.
42520ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(0, mTextView.getSelectionStart());
42530ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(mTextView.length(), mTextView.getSelectionEnd());
42540ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    }
42550ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
425672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
425772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
425872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
425972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
426072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
426172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
426272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
426372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
426472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
426572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
426672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
426772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
426872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
426972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
427072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
427172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
427272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
4273c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi
4274c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        // Tests for invalid arguments.
4275c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(request, null));
4276c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, outText));
4277c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, null));
427872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
427972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
428094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
428194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
4282c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
42832a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
428494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
428594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
428694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
428794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
4288c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
428994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
42912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
429294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
42942a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
429594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
42972a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
429894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
429994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43002a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
430194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
430294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43032a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
430494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
430594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43062a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
430702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
430802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
430902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection());
431002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
431102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
431202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection());
431394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
431494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
431594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
431694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
4317c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
431894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
431994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
43202a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
432194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
432294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43232a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
432494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
432594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43262a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
432794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
432894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
433094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43322a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
433394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43352a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
433694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
433794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
433902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
434002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
434102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
434202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
434302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
434402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
434594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
434694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
434794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
434894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
4349c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
435094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
435194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4352c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
435394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
435494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
435594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
435694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
435894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
435994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
436194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
436294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
436494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
436594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43662a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
436794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
436894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
43692a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
437094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
437194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
43722a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
437302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
437402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
437502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
437602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
437702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
437802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
437994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
438094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
438194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
438294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
4383c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
438494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
438594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
43862a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
438794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
438894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
43892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
439094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
439194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
43922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
439394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
439494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
43952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
439694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
439794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
43982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
439994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
440094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
44012a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
440294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
440394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
44042a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
440502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
440602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
440702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
440802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
440902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
441002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
441194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
441294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
441394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
441494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
4415c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
441694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
441794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4418c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
441994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
442094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
442194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
442294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
44232a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
442494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
442594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
44262a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
442794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
442894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
443094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
44322a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
443394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
44352a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
443694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
443794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
44382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
443994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
444002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
444102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
444202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
444302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
444402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
444502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
444694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
444794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
444894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
444994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
44502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
445194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
445294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
44532a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
445494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
445594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
445794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
445894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
44592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
446094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
446194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
44622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
446394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
446494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
44652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
446602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
446702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
446802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
446902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
447002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
447102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
447294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
447394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
447494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
447594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
4476c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
4477c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
447894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
447994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
448094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
44812a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
448294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4483f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
448494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
4485f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
4486f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
4487f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
4488f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
44892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
449094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
449194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
449202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
449302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongLtr() {
449402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
449502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
449602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
449702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
449802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
449902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
450002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
450102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
450202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
450302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
450402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
450502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
450602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
450702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
450802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
450902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
451002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
451102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
451202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
451302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
451402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
451502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
451602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
451702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
451802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
451902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
452002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
452102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
452202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
452302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
452402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
452502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
452602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is LTR.
452702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
452802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
452902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
453002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
453102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
453202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
453302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
453402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
453502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
453602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
453702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
453802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
453902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
454002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
454102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
454202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
454302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongRtl() {
454402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
454502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
454602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
454702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
454802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
454902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
455002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
455102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
455202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
455302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
455402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
455502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
455602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
455702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
455802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
455902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
456002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
456102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
456202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
456302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
456402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
456502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
456602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
456702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
456802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
456902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
457002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
457102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
457202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
457302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
457402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
457502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
457602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is RTL.
457702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
457802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
457902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
458002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
458102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
458202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
458302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
458402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
458502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
458602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
458702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
458802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
458902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
459002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
459102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
4592c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    public void testTextLocales() {
4593c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        TextView tv = new TextView(mActivity);
4594c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.getDefault(), tv.getTextLocale());
4595c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.getDefault(), tv.getTextLocales());
4596c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4597c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocale(Locale.CHINESE);
4598c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.CHINESE, tv.getTextLocale());
4599c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales());
4600c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4601c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocales(LocaleList.forLanguageTags("en,ja"));
4602c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale());
4603c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales());
4604c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4605c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4606c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocale(null);
4607c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to null should throw");
4608c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4609c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4610c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4611c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4612c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4613c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(null);
4614c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locales to null should throw");
4615c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4616c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4617c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4618c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4619c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4620c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(new LocaleList());
4621c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to an empty list should throw");
4622c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4623c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4624c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4625c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    }
4626c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4627b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    public void testAllCapsLocalization() {
4628b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        String testString = "abcdefghijklmnopqrstuvwxyz";
4629b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4630b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        // The capitalized characters of "i" on Turkish and Azerbaijani are different from English.
4631b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        Locale[] testLocales = {
4632b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("az", "AZ"),
4633b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("tr", "TR"),
4634b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("en", "US"),
4635b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        };
4636b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4637b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        TextView tv = new TextView(mActivity);
4638b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        tv.setAllCaps(true);
4639b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        for (Locale locale: testLocales) {
4640b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            tv.setTextLocale(locale);
4641b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            assertEquals("Locale: " + locale.getDisplayName(),
4642b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         testString.toUpperCase(locale),
4643b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         tv.getTransformationMethod().getTransformation(testString, tv).toString());
4644b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        }
4645b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    }
4646b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4647dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4648dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
4649dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
46507fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4651dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
46527fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4653dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4654dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4655dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4656dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
4657dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4658dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4659dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
46607fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4661dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4662dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
46637fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
4664dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4665dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
46667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
4667dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4668dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
46697fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
4670dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4671dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
46727fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
4673dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4674dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
46757fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
4676dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4677dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4678dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4679dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
4680dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4681dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
46827fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4683dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4684757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
4685dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
46867fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4687dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4688757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
4689757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4690757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4691757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
4692dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
46937fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4694dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4695dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
46967fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4697dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4698dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
46997fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4700dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4701dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
47027fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4703dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4704dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4705dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4706dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
4707dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
4708dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4709dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4710dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4711dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
4712dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4713dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
47147fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4715dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4716dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4717dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
4718dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
47197fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
4720dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4721dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
47227fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4723dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4724dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
47257fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4726dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4727dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
47287fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4729dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4730dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
47317fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4732dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4733dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
47347fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4735dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4736dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
4737dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4738dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4739dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
47407fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4741dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4742dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
47437fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4744dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4745dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
47467fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4747dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4748dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
47497fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4750dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4751dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
47527fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4753dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4754dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4755dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4756dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
47574ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4758dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4759dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
4760dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
4761dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4762dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4763dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
47647fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4765dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
47664f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // No reset when we remove the view
4767dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
47684f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
47694f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio
47704f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Reset is done when we add the view
47714f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Default text alignment is GRAVITY
47724f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        ll.addView(tv);
47737fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4774dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4775dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4776b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
4777b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
4778b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
4779b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
4780b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
4781b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
4782b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
47834ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4784b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4785b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
4786b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
4787b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
4788b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4789b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4790b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4791b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4792b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4793b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4794b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4795b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4796b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4797b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4798b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
4799b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
4800b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4801b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4802b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4803b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4804b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4805b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4806b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4807b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4808b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4809b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4810b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4811b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
4812b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
4813b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4814b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4815b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4816b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4817b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4818b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4819b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4820b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4821b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4822b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4823b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4824b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
4825b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
4826b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4827b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4828b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4829b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4830b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4831b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4832b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4833b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4834b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4835b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4836b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4837b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
4838b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4839b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4840b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4841b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4842b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4843b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4844b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4845b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4846b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4847b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4848b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4849b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4850b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
4851b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4852b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4853b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4854b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4855b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4856b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4857b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4858b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4859b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4860b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4861b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4862b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4863b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
4864b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4865b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
4866b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4867b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4868b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4869b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4870b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4871b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4872b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4873b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4874b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4875b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4876b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4877b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
4878b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4879b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
4880b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4881b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4882b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4883b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4884b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4885b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4886b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4887b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4888b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4889b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4890b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4891b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
4892b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4893b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4894b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4895b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4896b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4897b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4898b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4899b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4900b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4901b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4902b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4903b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4904b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4905b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
4906b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4907b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4908b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4909b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4910b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4911b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4912b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4913b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4914b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4915b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4916b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4917b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4918b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
4919b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
49209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    @UiThreadTest
49219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    public void testDrawableResolution2() {
49229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int LEFT = 0;
49239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int TOP = 1;
49249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int RIGHT = 2;
49259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int BOTTOM = 3;
49269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49274ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
49289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
49309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
49319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
49329776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49379776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
49389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
49399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49409776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
49419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49429776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null);
49439776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49449776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
49469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49499776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49509776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49519776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
49529776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49539776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49549776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49559776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49569776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49579776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49589776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
49599776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
49609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49619776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
49629776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49639776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null);
49649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49659776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49669776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49679776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49689776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49699776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49719776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49729776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_ltr);
49739776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49749776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49759776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
49769776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49779776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49789776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49799776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49809776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, getDrawable(R.drawable.icon_red), null);
49819776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49829776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49839776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
49849776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49859776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
49869776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
49879776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null);
49919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
49929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49939776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
49949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
49959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
49969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
49979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
49989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
49999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
5000e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetBreakStrategy() {
5001e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
5002e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
50032751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        final PackageManager pm = getInstrumentation().getTargetContext().getPackageManager();
50042751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka
5005d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for
50062751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // TextView except for Android Wear. The default value for Android Wear is
50072751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // BREAK_STRATEGY_BALANCED.
50082751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
50092751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // Android Wear
50102751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
50112751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        } else {
50122751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // All other form factor.
50132751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
50142751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        }
5015e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5016e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
5017e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy());
5018e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5019e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
5020e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
5021e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5022e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
5023e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
5024d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5025d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        EditText et = new EditText(mActivity);
5026d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5027d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for
5028d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // EditText.
5029d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
5030d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5031d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
5032d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
5033d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5034d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
5035d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy());
5036d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
5037d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
5038d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy());
5039e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
5040e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5041e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetHyphenationFrequency() {
5042e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
5043e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5044d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
5045e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5046e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
5047e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency());
5048e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5049e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL);
5050e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
5051e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
5052e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
5053e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency());
5054e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
5055e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
505632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomSelectionActionModeCallback() {
505732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        final String text = "abcde";
505832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
505932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
506032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView = new EditText(mActivity);
506132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mActivity.setContentView(mTextView);
506232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setText(text, BufferType.SPANNABLE);
506332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setTextIsSelectable(true);
506432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.requestFocus();
506532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setSelected(true);
506632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
506732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
506832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
506932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
507032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
507132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomSelectionActionModeCallback());
507232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
507332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackBlockActionMode = new MockActionModeCallback(false);
507432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackBlockActionMode);
507532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackBlockActionMode,
507632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.getCustomSelectionActionModeCallback());
507732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
507832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
507932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
508032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
508132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
508232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
508332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
50848e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
508532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
508632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
508732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
508832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
508932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
509032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackBlockActionMode.getCreateCount());
509132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
509232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
509332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
509432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
509532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
509632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
509732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
509832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
509932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
510032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was blocked.
510132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(0, callbackBlockActionMode.getDestroyCount());
510232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
510332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Overwrite callback.
510432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackStartActionMode = new MockActionModeCallback(true);
510532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackStartActionMode);
510632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackStartActionMode, mTextView.getCustomSelectionActionModeCallback());
510732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
510832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
510932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
511032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
511132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
511232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
511332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
51148e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
511532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
511632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
511732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
511832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
511932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
512032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
512132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getCreateCount());
512232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
512332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
512432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
512532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
512632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
512732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
512832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
512932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
513032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
513132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was started
513232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getDestroyCount());
513332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
513432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
513532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomInseltionActionMode() {
513632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        initTextViewForTyping();
513732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
513832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomInsertionActionModeCallback());
513932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
514032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callback = new MockActionModeCallback(false);
514132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomInsertionActionModeCallback(callback);
514232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callback, mTextView.getCustomInsertionActionModeCallback());
514332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // TODO(Bug: 22033189): Tests the set callback is actually used.
514432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
514532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
514632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    private static class MockActionModeCallback implements ActionMode.Callback {
514732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mCreateCount = 0;
514832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mDestroyCount = 0;
514932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private final boolean mAllowToStartActionMode;
515032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
515132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public MockActionModeCallback(boolean allowToStartActionMode) {
515232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mAllowToStartActionMode = allowToStartActionMode;
515332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
515432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
515532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getCreateCount() {
515632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mCreateCount;
515732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
515832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
515932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getDestroyCount() {
516032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mDestroyCount;
516132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
516232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
516332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
516432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
516532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
516632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
516732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
516832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
516932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public void onDestroyActionMode(ActionMode mode) {
517032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mDestroyCount++;
517132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
517232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
517332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
517432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
517532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mCreateCount++;
517632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mAllowToStartActionMode;
517732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
517832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
517932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
518032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
518132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
518232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
518332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    };
518432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
518572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
518672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
518772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
518872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
518972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
519072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
519172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
519272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
519372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
519472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
519572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
519672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
519772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
5198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
5199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
5202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
5208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
5211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
5217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
5218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
5221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
5222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
52259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return ((BitmapDrawable) getDrawable(resid)).getBitmap();
52269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
52279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
52289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    private Drawable getDrawable(int resid) {
52299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return mActivity.getResources().getDrawable(resid);
5230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
5233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
5236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
5242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
5245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
5251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
5254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
5260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
5263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
5269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
5272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
5279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
5280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
5282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
5283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
5285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
5288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
5294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
5297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
5303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
5306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
5312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
5315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
5321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
5324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
5330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
5333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
5339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
5342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
5348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
5351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
5357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
5360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
5366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
5368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
5369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
5371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
5375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
5376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
5379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
5380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
5383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
5384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
5387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
5388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
5392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
5394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
5396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
5400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
5401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
5404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
5405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
5409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
5410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
5413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
5414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
5418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
5427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
5428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
5430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
5434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
5435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5437e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
5438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
5439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
5443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
5452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
5453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
5455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
5459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
5460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
5461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
5462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
5464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
5465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
5466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
5467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
5470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
5471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
5474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
5475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
5478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
5479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
5482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
5483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
5487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
5490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
5491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
5496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
5497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
5498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
5499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
5500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
5501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
5502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
5504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
5506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
5507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
5508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
5510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
5511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
5514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
5515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
5518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
5519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
5520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
5525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
5526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
5527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
5528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
5529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
5530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
5531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
5533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
5535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
5536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
5537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
5539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
5540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
5543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
5544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
5548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
5551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
5552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
5553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
5554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5557277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5558277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    /**
5559277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     * A TextWatcher that converts the text to spaces whenever the text changes.
5560277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     */
5561277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    private static class ConvertToSpacesTextWatcher implements TextWatcher {
5562277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        boolean mChangingText;
5563277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5564277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5565277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5566277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5567277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5568277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5569277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void onTextChanged(CharSequence s, int start, int before, int count) {
5570277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5571277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5572277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5573277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void afterTextChanged(Editable s) {
5574277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Avoid infinite recursion.
5575277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            if (mChangingText) {
5576277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                return;
5577277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5578277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = true;
5579277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Create a string of s.length() spaces.
5580277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            StringBuilder builder = new StringBuilder(s.length());
5581277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            for (int i = 0; i < s.length(); i++) {
5582277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                builder.append(' ');
5583277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5584277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            s.replace(0, s.length(), builder.toString());
5585277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = false;
5586277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5587277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
5588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
5589