TextViewTest.java revision d14d9c9a3d9d8eeed720ecf28716fc51942c096a
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
19faa56693529d6029723365a604b2da97276de5f7Siyamed Sinirimport android.text.Html;
20faa56693529d6029723365a604b2da97276de5f7Siyamed Sinirimport android.text.Spanned;
21a3e5fa456a01c74b91a5d66981433db598bcc9a7Agatha Manimport android.widget.cts.R;
22fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
23fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport org.xmlpull.v1.XmlPullParserException;
24fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
25fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity;
26fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation;
27fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor;
28fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent;
292751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager;
30fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList;
31fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException;
320162547f44173f0604d8a80143c128d9892460a1Kristian Monsenimport android.cts.util.PollingCheck;
33d82745ff4a8b174f7be1258fd329dedc52ce58bbChenjie Luoimport android.cts.util.WidgetTestUtils;
34fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
35fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
36fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
37afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path;
38fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
40afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF;
41fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
43fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
45fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
465b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable;
47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
48e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonakaimport android.test.MoreAsserts;
4972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter;
53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType;
54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout;
55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection;
56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable;
57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString;
58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
61afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
74afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize;
75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
76fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
78fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
80c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournaderimport android.util.LocaleList;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
83afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo;
8432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.ActionMode;
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
107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
108b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale;
109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
1134ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luopublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> {
114fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
1197375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "the width of the view. New devices have a much larger screen which "
1207375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "actually enables long strings to be displayed with no fading. "
1217375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "I have made this string longer to fix this case. If you are correcting "
1227375565c2caf62392b32049cafb7df0730373794Gilles Debunne            + "this text, I would love to see the kind of devices you guys now use!";
123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
12422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
127a3e5fa456a01c74b91a5d66981433db598bcc9a7Agatha Man        super("android.widget.cts", TextViewCtsActivity.class);
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
1344594468cc37000395ee2a000da08651e73e78508keunyoung        new PollingCheck() {
1354594468cc37000395ee2a000da08651e73e78508keunyoung            @Override
1364594468cc37000395ee2a000da08651e73e78508keunyoung                protected boolean check() {
1374594468cc37000395ee2a000da08651e73e78508keunyoung                return mActivity.hasWindowFocus();
1384594468cc37000395ee2a000da08651e73e78508keunyoung            }
1394594468cc37000395ee2a000da08651e73e78508keunyoung        }.run();
140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
14328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    /**
14428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     * Promotes the TextView to editable and places focus in it to allow simulated typing.
14528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook     */
14628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    private void initTextViewForTyping() {
14728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mActivity.runOnUiThread(new Runnable() {
14828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            public void run() {
14928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView = findTextView(R.id.textview_text);
15028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
15128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.setText("", BufferType.EDITABLE);
15228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.requestFocus();
15328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook            }
15428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        });
15528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.waitForIdleSync();
15628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
15728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessText() {
168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String expected = mActivity.getResources().getString(R.string.text_view_hello);
171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(expected);
172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, tv.getText().toString());
173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null);
175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
3094bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
3124bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity());
313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
3344bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity());
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
3404bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio        assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity());
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
459325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    public void testGetTextColor() {
460325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        // TODO: How to get a suitable TypedArray to test this method.
461325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
462325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        try {
463325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            TextView.getTextColor(mActivity, null, -1);
464325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette            fail("There should be a NullPointerException thrown out.");
465325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        } catch (NullPointerException e) {
466325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette        }
467325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette    }
468325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
66253959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
66353959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
7249c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
7259c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
7339c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
7409c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
79292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
79692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
80292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
80692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
81092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
816ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight());
817ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette
818ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // edge case where the behavior of Math.round() deviates from
819ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        // FastMath.round(), requiring us to use an explicit 0 value
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
823ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette        assertEquals(0, mTextView.getLineHeight());
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
85472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
87072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
87372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
87472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
88572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
89707b9d3406e116f2f6b92932925783eed79503de0Mist Liao        Activity oldActivity = newActivity;
89807b9d3406e116f2f6b92932925783eed79503de0Mist Liao        while (true) {
89907b9d3406e116f2f6b92932925783eed79503de0Mist Liao            newActivity = am.waitForActivityWithTimeout(TIMEOUT);
90007b9d3406e116f2f6b92932925783eed79503de0Mist Liao            assertNotNull(newActivity);
90107b9d3406e116f2f6b92932925783eed79503de0Mist Liao            if (newActivity != oldActivity) {
90207b9d3406e116f2f6b92932925783eed79503de0Mist Liao                break;
90307b9d3406e116f2f6b92932925783eed79503de0Mist Liao            }
90407b9d3406e116f2f6b92932925783eed79503de0Mist Liao        }
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
90672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
956e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
960e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
964e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertFalse(factory.hasCalledNewSpannable());
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
968e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
974e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        assertTrue(factory.hasCalledNewSpannable());
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
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(shortString.length(), mTextView.getSelectionStart());
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), 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
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1272faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
1273faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testSetText_setsMovementMethodWhenLinksClickableAndTextContainsClickableSpans() {
1274faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
1275faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
1276faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1277faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
1278faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
1279faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNull("TextView.setText should not set movement method if linksClickable is false",
1280faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                mTextView.getMovementMethod());
1281faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1282faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
1283faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
1284faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.setText should set movement method if linksClickable is true " +
1285faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "and text contains clickable spans", mTextView.getMovementMethod());
1286faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
1287faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
1288af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    public void testRemoveSelectionWithSelectionHandles() {
1289af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        initTextViewForTyping();
1290af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1291af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1292af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1293af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1294af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setTextIsSelectable(true);
1295af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                mTextView.setText("abcd", BufferType.EDITABLE);
1296af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1297af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1298af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1299af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1300af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Long click on the text selects all text and shows selection handlers. The view has an
1301af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // attribute layout_width="wrap_content", so clicked location (the center of the view)
1302af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // should be on the text.
1303af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        TouchUtils.longClickView(this, mTextView);
1304af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1305af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mActivity.runOnUiThread(new Runnable() {
1306af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            @Override
1307af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            public void run() {
1308af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi                Selection.removeSelection((Spannable) mTextView.getText());
1309af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi            }
1310af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        });
1311af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1312af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        // Make sure that a crash doesn't happen with {@link Selection#removeSelection}.
1313af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi        mInstrumentation.waitForIdleSync();
1314af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi    }
1315af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi
1316c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_insert() {
131728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
13185b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13195b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text.
13205b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
13215b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
13225b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
132328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The cursor is at the end of the text.
132428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13255b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13265b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo removes the typed string in one step.
13275b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13285b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
132928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13305b51f77b99861d48fec1c327252416f726b3b01aJames Cook
133128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo restores the text and cursor position.
13325b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
13335b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
133428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13355b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13365b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undoing the redo clears the text again.
13375b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13385b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
13395b51f77b99861d48fec1c327252416f726b3b01aJames Cook
13405b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo when the undo stack is empty does nothing.
13415b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13425b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
13435b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
13445b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
13455b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
134628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
13475b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1348c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_delete() {
134928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
13505b51f77b99861d48fec1c327252416f726b3b01aJames Cook
135128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Simulate deleting text and undoing it.
135228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("xyz");
135328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
13545b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
13555b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
135628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Precondition: The text was actually deleted.
135728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
135828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
135928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
136028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undo restores the typed string and cursor position in one step.
13615b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
136228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
136328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
13645b51f77b99861d48fec1c327252416f726b3b01aJames Cook
136528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Redo removes the text in one step.
136628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
136728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("", mTextView.getText().toString());
136828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13695b51f77b99861d48fec1c327252416f726b3b01aJames Cook
137028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing the redo restores the text again.
137128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
137228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("xyz", mTextView.getText().toString());
137328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(3, mTextView.getSelectionStart());
137428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
137528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                // Undoing again undoes the original typing.
13765b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
13775b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
137828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals(0, mTextView.getSelectionStart());
13795b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
13805b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
13815b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
138228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
13835b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1384c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Initialize the text view for simulated IME typing. Must be called on UI thread.
1385c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private InputConnection initTextViewForSimulatedIme() {
1386c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView = findTextView(R.id.textview_text);
1387c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE));
1388c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("", BufferType.EDITABLE);
1389c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        return mTextView.onCreateInputConnection(new EditorInfo());
1390c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1391c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1392c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    // Simulates IME composing text behavior.
1393c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    private void setComposingTextInBatch(InputConnection input, CharSequence text) {
1394c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1395c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText(text, 1);  // Leave cursor at end.
1396c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1397c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1398c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1399c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1400c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertLatin() {
1401c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1402c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1403c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words,
1404c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // such as "c" -> "ca" -> "cat" -> "cat ".
1405c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "c");
1406c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "ca");
1407c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1408c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The completion and space are added in the same batch.
1409c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1410c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("cat", 1);
1411c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText(" ", 1);
1412c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1413c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1414c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements undo in a single step.
1415c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1416c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1417c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1418c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1419c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1420c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeInsertJapanese() {
1421c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1422c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1423c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji.
1424c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1425c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String NA = "\u306A";  // HIRAGANA LETTER NA
1426c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1427c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1428c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1429c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + NA);
1430c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1431c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The result may be a surrogate pair. The composition ends in the same batch.
1432c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1433c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.commitText("\uD83C\uDF37", 1);  // U+1F337 TULIP
1434c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.setComposingText("", 1);
1435c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1436c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1437c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // The repeated replacements are a single undo step.
1438c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1439c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("", mTextView.getText().toString());
1440c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1441c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1442c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1443c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeCancel() {
1444c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1445c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1446c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1447c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Start typing a composition.
1448c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        final String HA = "\u306F";  // HIRAGANA LETTER HA
1449c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "h");
1450c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA);
1451c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, HA + "n");
1452c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1453c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Cancel the composition.
1454c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        setComposingTextInBatch(input, "");
1455c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1456c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1457c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1458c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1459c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1460c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1461c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1462c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1463c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    @UiThreadTest
1464c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_imeEmptyBatch() {
1465c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        InputConnection input = initTextViewForSimulatedIme();
1466c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.setText("flower");
1467c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1468c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Send an empty batch edit. This happens if the IME is hidden and shown.
1469c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.beginBatchEdit();
1470c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        input.endBatchEdit();
1471c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1472c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Undo and redo do nothing.
1473c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.undo);
1474c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1475c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mTextView.onTextContextMenuItem(android.R.id.redo);
1476c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        assertEquals("flower", mTextView.getText().toString());
1477c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    }
1478c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook
1479c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_setText() {
1480277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
148128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1482c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        // Create two undo operations, an insert and a delete.
1483c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        mInstrumentation.sendStringSync("xyz");
1484c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook        sendKeys(KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL);
1485277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1486277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1487c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook                // Calling setText() clears both undo operations, so undo doesn't happen.
1488277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1489277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1490277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
149128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1492277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Clearing text programmatically does not undo either.
1493277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("", BufferType.EDITABLE);
1494277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1495277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1496277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1497277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1498277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1499277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
150028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1501c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testRedo_setText() {
1502277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1503277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1504277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text. This creates an undo entry.
1505277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1506277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1507277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1508277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo the typing to create a redo entry.
1509277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1510277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1511277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Calling setText() clears the redo stack, so redo doesn't happen.
1512277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.setText("Hello", BufferType.EDITABLE);
1513277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.redo);
1514277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("Hello", mTextView.getText().toString());
1515277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1516277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1517277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1518277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1519277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1520c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directAppend() {
1521277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
152228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1523277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1524277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1525277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1526277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1527277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Programmatically append some text.
1528277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.append("def");
1529277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abcdef", mTextView.getText().toString());
1530277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1531277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the append as a separate step.
1532277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1533277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1534277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1535277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1536277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1537277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1538277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1539277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1540277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1541277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1542277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1543c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_directInsert() {
1544277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1545277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1546277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1547277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1548277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1549277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1550277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Directly modify the underlying Editable to insert some text.
1551277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // NOTE: This is a violation of the API of getText() which specifies that the
1552277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // returned object should not be modified. However, some apps do this anyway and
1553277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // the framework needs to handle it.
1554277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                Editable text = (Editable) mTextView.getText();
1555277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                text.insert(0, "def");
1556277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("defabc", mTextView.getText().toString());
1557277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1558277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo removes the insert as a separate step.
1559277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1560277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("abc", mTextView.getText().toString());
1561277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1562277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Another undo removes the original typing.
1563277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1564277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1565277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1566277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1567277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1568277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
1569277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1570c530472a02205f0b7d87f9f06140c56ca0849816James Cook    public void testUndo_noCursor() {
1571c530472a02205f0b7d87f9f06140c56ca0849816James Cook        initTextViewForTyping();
1572c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1573c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mActivity.runOnUiThread(new Runnable() {
1574c530472a02205f0b7d87f9f06140c56ca0849816James Cook            public void run() {
1575c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Append some text to create an undo operation. There is no cursor present.
1576c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.append("cat");
1577c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1578c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Place the cursor at the end of the text so the undo will have to change it.
1579c530472a02205f0b7d87f9f06140c56ca0849816James Cook                Selection.setSelection((Spannable) mTextView.getText(), 3);
1580c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1581c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // Undo the append. This should not crash, despite not having a valid cursor
1582c530472a02205f0b7d87f9f06140c56ca0849816James Cook                // position in the undo operation.
1583c530472a02205f0b7d87f9f06140c56ca0849816James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1584c530472a02205f0b7d87f9f06140c56ca0849816James Cook            }
1585c530472a02205f0b7d87f9f06140c56ca0849816James Cook        });
1586c530472a02205f0b7d87f9f06140c56ca0849816James Cook        mInstrumentation.waitForIdleSync();
1587c530472a02205f0b7d87f9f06140c56ca0849816James Cook    }
1588c530472a02205f0b7d87f9f06140c56ca0849816James Cook
1589c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_textWatcher() {
1590277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        initTextViewForTyping();
1591277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1592277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Add a TextWatcher that converts the text to spaces on each change.
1593277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1594277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1595277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        // Type some text.
1596277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.sendStringSync("abc");
1597277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mActivity.runOnUiThread(new Runnable() {
1598277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            public void run() {
1599277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // TextWatcher altered the text.
1600277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("   ", mTextView.getText().toString());
1601277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
1602277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                // Undo reverses both changes in one step.
1603277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1604277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertEquals("", mTextView.getText().toString());
1605277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
1606277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        });
1607277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        mInstrumentation.waitForIdleSync();
1608c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    }
1609c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1610c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook    public void testUndo_textWatcherDirectAppend() {
1611c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        initTextViewForTyping();
1612c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1613c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        // Add a TextWatcher that converts the text to spaces on each change.
1614c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher());
1615c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1616c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mActivity.runOnUiThread(new Runnable() {
1617c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            public void run() {
1618c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Programmatically append some text. The TextWatcher changes it to spaces.
1619c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.append("abc");
1620c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("   ", mTextView.getText().toString());
1621c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook
1622c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                // Undo reverses both changes in one step.
1623c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
1624c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook                assertEquals("", mTextView.getText().toString());
1625c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook            }
1626c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        });
1627c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook        mInstrumentation.waitForIdleSync();
162828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook    }
162928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
1630c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_shortcuts() {
163128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
163228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook
163328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        // Type some text.
163428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        mInstrumentation.sendStringSync("abc");
16355b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
16365b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
16375b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Z triggers undo.
16385b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0,
16395b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        KeyEvent.META_CTRL_LEFT_ON);
1640277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control));
16415b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
16425b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16435b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Pressing Control-Shift-Z triggers redo.
16445b51f77b99861d48fec1c327252416f726b3b01aJames Cook                KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z,
16455b51f77b99861d48fec1c327252416f726b3b01aJames Cook                        0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON);
1646277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift));
164728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook                assertEquals("abc", mTextView.getText().toString());
16485b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
16495b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
16505b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
16515b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
16525b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1653c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceState() {
165428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
16555b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16565b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Type some text to create an undo operation.
16575b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.sendStringSync("abc");
16585b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
16595b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
16605b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Parcel and unparcel the TextView.
16615b51f77b99861d48fec1c327252416f726b3b01aJames Cook                Parcelable state = mTextView.onSaveInstanceState();
16625b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onRestoreInstanceState(state);
16635b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
16645b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
16655b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
16665b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16675b51f77b99861d48fec1c327252416f726b3b01aJames Cook        // Delete a character to create a new undo operation.
16685b51f77b99861d48fec1c327252416f726b3b01aJames Cook        sendKeys(KeyEvent.KEYCODE_DEL);
16695b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mActivity.runOnUiThread(new Runnable() {
16705b51f77b99861d48fec1c327252416f726b3b01aJames Cook            public void run() {
16715b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("ab", mTextView.getText().toString());
16725b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16735b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the delete.
16745b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16755b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("abc", mTextView.getText().toString());
16765b51f77b99861d48fec1c327252416f726b3b01aJames Cook
16775b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // Undo the typing, which verifies that the original undo operation was parceled
16785b51f77b99861d48fec1c327252416f726b3b01aJames Cook                // correctly.
16795b51f77b99861d48fec1c327252416f726b3b01aJames Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
16805b51f77b99861d48fec1c327252416f726b3b01aJames Cook                assertEquals("", mTextView.getText().toString());
16815f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
16825f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Parcel and unparcel the undo stack (which is empty but has been used and may
16835f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // contain other state).
16845f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
16855f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
16865f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
16875f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
16885f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
16895f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook    }
16905f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
1691c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook    public void testUndo_saveInstanceStateEmpty() {
16925f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        initTextViewForTyping();
16935f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
16945f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Type and delete to create two new undo operations.
16955f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("a");
16965f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
16975f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
16985f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
16995f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Empty the undo stack then parcel and unparcel the TextView. While the undo
17005f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // stack contains no operations it may contain other state.
17015f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17025f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17035f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                Parcelable state = mTextView.onSaveInstanceState();
17045f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onRestoreInstanceState(state);
17055f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            }
17065f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        });
17075f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.waitForIdleSync();
17085f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook
17095f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        // Create two more undo operations.
17105f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mInstrumentation.sendStringSync("b");
17115f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        sendKeys(KeyEvent.KEYCODE_DEL);
17125f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook        mActivity.runOnUiThread(new Runnable() {
17135f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook            public void run() {
17145f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                // Verify undo still works.
17155f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17165f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("b", mTextView.getText().toString());
17175f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                mTextView.onTextContextMenuItem(android.R.id.undo);
17185f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook                assertEquals("", mTextView.getText().toString());
17195b51f77b99861d48fec1c327252416f726b3b01aJames Cook            }
17205b51f77b99861d48fec1c327252416f726b3b01aJames Cook        });
17215b51f77b99861d48fec1c327252416f726b3b01aJames Cook        mInstrumentation.waitForIdleSync();
17225b51f77b99861d48fec1c327252416f726b3b01aJames Cook    }
17235b51f77b99861d48fec1c327252416f726b3b01aJames Cook
1724b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCopyAndPaste() {
1725b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1726b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1727b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1728b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1729b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1730b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1731b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Copy "bc".
1732b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1733b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
1734b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1735b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "bc" between "b" and "c".
1736b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
1737b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1738b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("abbccd", mTextView.getText().toString());
1739b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1740b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Select entire text and paste "bc".
1741b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1742b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1743b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("bc", mTextView.getText().toString());
1744b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1745b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1746b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1747b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1748b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
174949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCopyAndPaste_byKey() {
175049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
175149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
175249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
175349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
175449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
175549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
175649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
175749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
175849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
175949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
176049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
176149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Copy "bc"
176249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_COPY);
176349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
176449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
176549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
176649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Set cursor between 'b' and 'c'.
176749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 2, 2);
176849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
176949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
177049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
177149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
177249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
177349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("abbcc", mTextView.getText().toString());
177449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
177549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
177649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
177749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
177849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
177949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON);
178049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + copy doesn't perform copy.
178149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
178249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
178349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
178449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcabbcc", mTextView.getText().toString());
178549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
178649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
178749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
178849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
178949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + copy doesn't perform copy.
179049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
179149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
179249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
179349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcabbcc", mTextView.getText().toString());
179449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
179549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
179649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0,
179749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
179849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + copy doesn't perform copy.
179949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta);
180049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
180149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
180249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bcbcbcabbcc", mTextView.getText().toString());
180349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
180449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
180549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
180649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1807b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste() {
1808b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1809b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1810b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1811b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("abcd", BufferType.EDITABLE);
1812b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1813b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1814b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "bc".
1815b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
1816b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1817b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1818b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1819b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut "ad".
1820b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 2);
1821b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1822b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1823b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1824b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste "ad".
1825b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1826b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("ad", mTextView.getText().toString());
1827b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1828b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1829b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1830b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1831b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
183249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    public void testCutAndPaste_byKey() {
183349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        initTextViewForTyping();
183449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
183549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Type "abc".
183649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.sendStringSync("abc");
183749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
183849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
183949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Select "bc"
184049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 1, 3);
184149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
184249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
184349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
184449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Cut "bc"
184549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_CUT);
184649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
184749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
184849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
184949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("a", mTextView.getText().toString());
185049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Move cursor to the head
185149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.setSelection((Spannable) mTextView.getText(), 0, 0);
185249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
185349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
185449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
185549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        // Paste "bc"
185649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        sendKeys(KeyEvent.KEYCODE_PASTE);
185749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        assertEquals("bca", mTextView.getText().toString());
185849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
185949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
186049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            public void run() {
186149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
186249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
186349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON);
186449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Shift + cut doesn't perform cut.
186549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
186649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
186749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
186849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
186949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_CTRL_LEFT_ON);
187049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + cut doesn't perform cut.
187149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
187249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
187349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
187449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0,
187549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                        KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON);
187649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                // Control + Shift + cut doesn't perform cut.
187749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta);
187849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi                assertEquals("bca", mTextView.getText().toString());
187949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi            }
188049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi        });
188149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi    }
188249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi
1883b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) {
1884b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final Spannable spannable = (Spannable)textView.getText();
1885b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        final int at = spannable.length() / 2;
1886b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        return spannable.getSpans(at, at, type).length > 0;
1887b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1888b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1889b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    public void testCutAndPaste_withAndWithoutStyle() {
1890b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        initTextViewForTyping();
1891b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
1892b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            public void run() {
1893b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setText("example", BufferType.EDITABLE);
1894b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.setSelected(true);
1895b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1896b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Set URLSpan.
1897b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                final Spannable spannable = (Spannable) mTextView.getText();
1898b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0);
1899b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1900b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1901b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Cut entire text.
1902b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1903b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.cut);
1904b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("", mTextView.getText().toString());
1905b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1906b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste without style.
1907b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText);
1908b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
1909b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text doesn't have URLSpan.
1910b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1911b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1912b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Paste with style.
1913b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                Selection.selectAll((Spannable) mTextView.getText());
1914b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.paste);
1915b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertEquals("example", mTextView.getText().toString());
1916b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                // Check that the text has URLSpan.
1917b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi                assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class));
1918b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi            }
1919b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        });
1920b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
1921b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi    }
1922b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi
1923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
19244ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    public void testSaveInstanceState() {
19254ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView originalTextView = new TextView(mActivity);
19264ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
19274ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setText(text);
19284ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setFreezesText(true);  // needed to actually save state
19294ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        Parcelable state = originalTextView.onSaveInstanceState();
19304ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19314ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView restoredTextView = new TextView(mActivity);
19324ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        restoredTextView.onRestoreInstanceState(state);
19334ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(text, restoredTextView.getText().toString());
19344ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
19354ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19364ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
19374ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    public void testSaveInstanceStateSelection() {
19384ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView originalTextView = new TextView(mActivity);
19394ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final String text = "This is a string";
19404ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        final Spannable spannable = new SpannableString(text);
19414ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setText(spannable);
19424ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setTextIsSelectable(true);
19434ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        Selection.setSelection((Spannable) originalTextView.getText(), 5, 7);
19444ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        originalTextView.setFreezesText(true);  // needed to actually save state
19454ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        Parcelable state = originalTextView.onSaveInstanceState();
19464ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19474ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        TextView restoredTextView = new TextView(mActivity);
19484ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        // Setting a selection only has an effect on a TextView when it is selectable.
19494ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        restoredTextView.setTextIsSelectable(true);
19504ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        restoredTextView.onRestoreInstanceState(state);
19514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(text, restoredTextView.getText().toString());
19524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(5, restoredTextView.getSelectionStart());
19534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien        assertEquals(7, restoredTextView.getSelectionEnd());
19544ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    }
19554ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien
19564ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien    @UiThreadTest
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
1958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
1964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
1968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
1973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
1980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
1981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
1984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
1986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
1987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
1989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
1990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
1993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
1994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
1997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
1998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
2000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
2001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
2002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
2004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
2006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
2007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
2008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
201553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        final String errorText = "Oops! There is an error";
2016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
2020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
20259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable icon = getDrawable(R.drawable.failed);
2026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
2029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
2034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
2038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2045300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance(""));
2046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
2048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
2054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2055dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
2057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
2058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
205953b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner        assertEquals(errorText, mTextView.getError().toString());
2060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2061300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2062300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            public void run() {
2063300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setKeyListener(DigitsKeyListener.getInstance());
2064300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setText("", BufferType.EDITABLE);
2065300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.setError(errorText);
2066300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu                mTextView.requestFocus();
2067300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu            }
2068300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        });
2069300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu        mInstrumentation.waitForIdleSync();
2070300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu
2071dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
2072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
2087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
2090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2097dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
2100dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2103dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2117fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Basic
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2125fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Single line
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
2144fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        /* Cursor coordinates from getPrimaryHorizontal() may have a fractional
2145fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * component, while the result of getFocusedRect is in int coordinates.
2146fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * It's not practical for these to match exactly, so we compare that the
2147fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * integer components match - there can be a fractional pixel
2148fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien         * discrepancy, which should be okay for all practical applications. */
2149fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left);
2150fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right);
2151fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2152fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2153fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2154fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2155fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2156fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2157fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2158fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 13, 3);
2159fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2160fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2161fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2162fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2163fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2164fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2165fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left);
2166fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right);
2167fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2168fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2169fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2170fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        // Multi lines
2171fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView = findTextView(R.id.textview_text_two_lines);
2172fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2173fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX(), rc.left);
2174fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
2175fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY(), rc.top);
2176fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
2177fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2178fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2179fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2180fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2181fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2182fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 4);
2183fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2184fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2185fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2186fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2187fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2188fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2189fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left);
2190fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien        assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right);
2191fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2192fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
2193fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio
2194fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mActivity.runOnUiThread(new Runnable() {
2195fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            public void run() {
2196fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setSelected(true);
2197fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                SpannableString text = new SpannableString(mTextView.getText());
2198fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                Selection.setSelection(text, 2, 10); // cross the "\n" and two lines
2199fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio                mTextView.setText(text);
2200fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio            }
2201fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        });
2202fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mInstrumentation.waitForIdleSync();
2203fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getFocusedRect(rc);
2204fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        Path path = new Path();
2205fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        mTextView.getLayout().getSelectionPath(2, 10, path);
2206fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        RectF rcf = new RectF();
2207fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        path.computeBounds(rcf, true);
2208fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertNotNull(mTextView.getLayout());
2209fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.left - 1, (float) rc.left);
2210fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(rcf.right + 1, (float) rc.right);
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
2212fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio        assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom);
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
229828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook        initTextViewForTyping();
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2300dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2302dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
2323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
2514119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson        // getTypeface will be null if android:typeface is set to normal,
2515c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // and android:style is not set or is set to normal, and
2516c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette        // android:fontFamily is not set
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2586f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2587f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() {
2588f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2589f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2590f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2591f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2592f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" another text without URL");
2593f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2594f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2595f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2596f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2597f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL another text without URL", text.toString());
2598f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2599f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2600f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2601f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() {
2602f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2603f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2604f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2605f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2606f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2607f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2608f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2609f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be zero", 0, urlSpans.length);
2610f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2611f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2612f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2613f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2614f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenAutoLinkIsEnabled() {
2615f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2616f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2617f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without URL");
2618f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2619f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2620f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2621f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2622f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2623f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2624f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2625f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2626f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text without URL text with URL http://android.com", text.toString());
2627f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2628f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2629f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2630f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() {
2631f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2632f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2633f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with URL http://android.com/before");
2634f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2635f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with URL http://android.com");
2636f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2637f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2638f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2639f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length);
2640f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("First URLSpan URL should be same",
2641f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/before");
2642f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2643f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[1].getURL(), "http://android.com");
2644f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("text with URL http://android.com/before text with URL http://android.com",
2645f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                text.toString());
2646f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2647f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2648f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2649f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() {
2650f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2651f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2652f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2653f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2654f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(" text with a url: http://android.com");
2655f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2656f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertNotNull("MovementMethod should not be null when text contains url",
2657f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod());
2658f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url",
2659f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                mTextView.getMovementMethod() instanceof LinkMovementMethod);
2660f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2661f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2662f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2663faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testAppend_setsMovementMethodWhenLinksClickableAndTextContainsClickableSpans() {
2664faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
2665faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
2666faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2667faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
2668faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append(text);
2669faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNull("TextView.append should not set movement method if linksClickable is false",
2670faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                mTextView.getMovementMethod());
2671faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2672faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText("");
2673faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
2674faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append(text);
2675faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.append should set movement method if linksClickable is true " +
2676faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "and text contains clickable spans", mTextView.getMovementMethod());
2677faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
2678faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2679faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
2680faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    public void testAppend_setMovementMethodForExistingTextWhenLinksClickableIsTrueDuringAppend() {
2681faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        Spanned text = Html.fromHtml("<a href='http://android.com'>link</a>");
2682faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView = new TextView(mActivity);
2683faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(false);
2684faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setText(text);
2685faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2686faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.setLinksClickable(true);
2687faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        mTextView.append("");
2688faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2689faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir        assertNotNull("TextView.append should set movement method if existing text contains " +
2690faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir                "links but new text does not", mTextView.getMovementMethod());
2691faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    }
2692faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir
2693faa56693529d6029723365a604b2da97276de5f7Siyamed Sinir    @UiThreadTest
2694f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() {
2695f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2696f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2697f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text without a URL");
2698f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2699f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append(new SpannableString(" text with a url: http://android.com"));
2700f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2701f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2702f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2703f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length);
2704f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2705f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2706f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2707f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2708f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2709f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() {
2710f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2711f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2712f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a partial url android.");
2713f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2714f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("com");
2715f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2716f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2717f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2718f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should be one after appending to partial URL",
2719f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                1, urlSpans.length);
2720f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the appended URL",
2721f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com");
2722f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2723f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2724f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    @UiThreadTest
2725f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() {
2726f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView = new TextView(mActivity);
2727f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setAutoLinkMask(Linkify.ALL);
2728f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.setText("text with a url http://android.com");
2729f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2730f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        mTextView.append("/textview");
2731f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2732f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        Spannable text = (Spannable) mTextView.getText();
2733f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
2734f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length);
2735f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir        assertEquals("URLSpan URL should be same as the new URL",
2736f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir                urlSpans[0].getURL(), "http://android.com/textview");
2737f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir    }
2738f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2739f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir
2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
276122d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
27790162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
278322d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
278422d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
2804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
2805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
2809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
2810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
2811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
2813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
2814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
2819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
2820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
28299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.blue);
28309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.yellow);
28319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable top = getDrawable(R.drawable.red);
2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
2850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
2852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
2874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
2876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
2878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
2883013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
2884013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
2885013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
2886013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2887013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
2888013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
2889013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2890013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
2891013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2892013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2893013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
2894013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2895013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2896013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
2897013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
2898013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
2899013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
2900013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
2901013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2904013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2905da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2906da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineWidth = 0;
2907da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        int singleLineHeight = 0;
2908da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2909da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2910da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineWidth = textView.getLayout().getWidth();
2911da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            singleLineHeight = textView.getLayout().getHeight();
2912da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2916013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2920013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
2921da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2922da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2923da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getHeight() > singleLineHeight);
2924da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertTrue(textView.getLayout().getWidth() < singleLineWidth);
2925da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
2928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2930013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
2931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2935013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2936da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu
2937da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        if (textView.getLayout() != null) {
2938da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineHeight, textView.getLayout().getHeight());
2939da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu            assertEquals(singleLineWidth, textView.getLayout().getWidth());
2940da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu        }
2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
2945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
2950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
2954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2966636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public int calculateTextWidth(String text) {
2967636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
2968636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2969636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        // Set the TextView width as the half of the whole text.
2970636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float[] widths = new float[text.length()];
2971636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView.getPaint().getTextWidths(text, widths);
2972636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        float textfieldWidth = 0.0f;
2973636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int i = 0; i < text.length(); ++i) {
2974636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            textfieldWidth += widths[i];
2975636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
2976636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        return (int)textfieldWidth;
2977636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2978636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
2979636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2980636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
2981636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_frequencyNone() {
2982636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] BREAK_STRATEGIES = {
2983636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY,
2984636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.BREAK_STRATEGY_BALANCED };
2985636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2986636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
2987636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2988636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int breakStrategy : BREAK_STRATEGIES) {
2989636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
2990636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
2991636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
2992636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2993636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
2994636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(breakStrategy);
2995636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2996636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
2997636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
2998636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
2999636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3000636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3001636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3002636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3003636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3004636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3005636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any break strategy, hyphenation should not happen if
3006636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // HYPHENATION_FREQUENCY_NONE is specified.
3007636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3008636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3009636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3010636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3011636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3012636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3013636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3014636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    @UiThreadTest
3015636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    public void testHyphenationNotHappen_breakStrategySimple() {
3016636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        final int[] HYPHENATION_FREQUENCIES = {
3017636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL,
3018636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            Layout.HYPHENATION_FREQUENCY_NONE };
3019636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3020636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        mTextView = findTextView(R.id.textview_text);
3021636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3022636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) {
3023636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            for (int charWidth = 10; charWidth < 120; charWidth += 5) {
3024636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                // Change the text view's width to charWidth width.
3025636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth)));
3026636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3027636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setText(LONG_TEXT);
3028636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
3029636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3030636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.setHyphenationFrequency(hyphenationFrequency);
3031636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3032636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.requestLayout();
3033636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                mTextView.onPreDraw();  // For freezing the layout.
3034636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                Layout layout = mTextView.getLayout();
3035636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3036636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                final int lineCount = layout.getLineCount();
3037636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                for (int line = 0; line < lineCount; ++line) {
3038636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    final int lineEnd = layout.getLineEnd(line);
3039636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // In any width, any hyphenation frequency, hyphenation should not happen if
3040636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    // BREAK_STRATEGY_SIMPLE is specified.
3041636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                    assertTrue(lineEnd == LONG_TEXT.length() ||
3042636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                            Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1)));
3043636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka                }
3044636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka            }
3045636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka        }
3046636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka    }
3047636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka
3048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
305072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
305172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
305372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
3066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
308472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
308572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
308672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
308772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
3088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
30979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
3100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
3101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
3105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
3114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
31169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
3123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
3129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
31349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable top = getDrawable(R.drawable.red);
3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
31609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final Drawable bottom = getDrawable(R.drawable.red);
3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
3184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
3187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
31899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable left = getDrawable(R.drawable.red);
3190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
3191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
3192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
3193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
3198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
3201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
3202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
3204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
3205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
32079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable right = getDrawable(R.drawable.red);
3208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
3209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
3210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
3211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
3214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
3215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
3222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
3223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
3225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
3226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
3227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
3228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
3229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
3232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
3235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
3243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
3244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3265fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testDeprecatedSetTextAppearance() {
3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
3279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3294fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testSetTextAppearance() {
3295fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3296fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3297fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_All);
3298fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3299fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3300fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3301fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3302fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3303fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3304fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3305fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3306fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3307fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Colors);
3308fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3309fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentTextColor());
3310fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3311fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getCurrentHintTextColor());
3312fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3313fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai                mTextView.getLinkTextColors().getDefaultColor());
3314fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3315fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_NotColors);
3316fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3317fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3318fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3319fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setTextAppearance(R.style.TextAppearance_Style);
3320fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(null, mTextView.getTypeface());
3321fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3322fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
3324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3327fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    public void testAccessCompoundDrawableTint() {
3328fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView = new TextView(mActivity);
3329fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3330fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        ColorStateList colors = ColorStateList.valueOf(Color.RED);
3331fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintList(colors);
3332fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR);
3333fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertSame(colors, mTextView.getCompoundDrawableTintList());
3334fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai        assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode());
3335fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai    }
3336fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai
3337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
3338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
3339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
3341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
3344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
3345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
3347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
3351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
3360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
3362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
3365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
3369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
3372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
3374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
3376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
3379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
3382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
3383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
3384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
3387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
3390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
3391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
3394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
3397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
3398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
3401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
3405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
3409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
3413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
3417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
3421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
3425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
3428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
3429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
3430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
3431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
3432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
3433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
3435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
3436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
3438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
3439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
3440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
3441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
3442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
3443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFadingEdgeStrength() {
344641f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewLeft = (MockTextView) mActivity.findViewById(
344741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_left);
3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
345041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewLeft.setEllipsize(null);
3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on right side if the text aligns left
345641f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewLeft.getLeftFadingEdgeStrength(), 0.01f);
345741f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewLeft.getRightFadingEdgeStrength(), 0.01f);
3458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
345941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewRight = (MockTextView) mActivity.findViewById(
346041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_right);
3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
346341f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewRight.setEllipsize(null);
3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on left side if the text aligns right
346841f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewRight.getLeftFadingEdgeStrength(), 0.01f);
346941f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(0.0f, textViewRight.getRightFadingEdgeStrength(), 0.01f);
3470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
347141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        final MockTextView textViewCenter = (MockTextView) mActivity.findViewById(
347241f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                R.id.mock_textview_center);
3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
347541f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio                textViewCenter.setEllipsize(null);
3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the text aligns center
348041f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getLeftFadingEdgeStrength(), 0.01f);
348141f2159687011d968e1ce3ac2a5b3fcba2e6af83Fabrice Di Meglio        assertEquals(1.0f, textViewCenter.getRightFadingEdgeStrength(), 0.01f);
3482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3484bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
3487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
3488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
3490bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3491bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3492bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3493bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
3494bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
3496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
3497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3500bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
3501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
3506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
3508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
3509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
3511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
3517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
35180162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
3522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
3523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
352672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float leftFadingEdgeStrength = textView.getLeftFadingEdgeStrength();
352772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float rightFadingEdgeStrength = textView.getRightFadingEdgeStrength();
352872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to continue
3530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the left fading becomes thicker while the right fading becomes thiner
3531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // as the text moves towards left
35320162547f44173f0604d8a80143c128d9892460a1Kristian Monsen        new PollingCheck(TIMEOUT) {
3533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
3536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && rightFadingEdgeStrength > textView.getRightFadingEdgeStrength();
3537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
3540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
3541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
3543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
3545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
3546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
3548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
3550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
376372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
376472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
376572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
376672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
376772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
376872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
376972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
37709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
377172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
377272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
377372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
377472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
377572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
377672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
377772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
377872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
377972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
378072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
378172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
378272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
378372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
378472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
378572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
378672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
378772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
378872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
378972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
379072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
379272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
379372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
379572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
379672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
379872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
379972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
380072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
380172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
380272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
380372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
380472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
380572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
380672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
380772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
380872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
380972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
381072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
381172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
381272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
381372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
381472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
381572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
381672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
381772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
381872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
381972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
382072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
382172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
382272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
382372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
382472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3825d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    public void testAccessImeHintLocales() {
3826d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final TextView textView = new TextView(mActivity);
3827d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setText("", BufferType.EDITABLE);
3828d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setKeyListener(null);
3829d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setRawInputType(InputType.TYPE_CLASS_TEXT);
3830d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertNull(textView.getImeHintLocales());
3831d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
3832d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
3833d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
3834d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertNull(editorInfo.hintLocales);
3835d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
3836d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
3837d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US");
3838d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        textView.setImeHintLocales(localeList);
3839d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        assertEquals(localeList, textView.getImeHintLocales());
3840d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        {
3841d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            final EditorInfo editorInfo = new EditorInfo();
3842d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            textView.onCreateInputConnection(editorInfo);
3843d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa            assertEquals(localeList, editorInfo.hintLocales);
3844d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa        }
3845d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa    }
3846d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa
3847c873101a88e7ba584065de5e912508237378ca99Victoria Lease    @UiThreadTest
384872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
384972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
385072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
385172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
385272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
385372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
385472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
385572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
385672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
385772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
385872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
385972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
386072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
386172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
386272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
386372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
386472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
386572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
386672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
386772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
386872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
386972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
387072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
387172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
387272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
387372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
387472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
387572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
387672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
387772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
387872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
387972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
388072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
388172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
388272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
388372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
388472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
388572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
388672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
388772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
388872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
388972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
389072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
389172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
389272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
389372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
389472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
389572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
389672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
389772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
389872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
389972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
390072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
390172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
390272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
390372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
390472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
390572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
390672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
390772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
390872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3909afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu    public void testIsInputMethodTarget() throws Throwable {
391072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
391172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
391272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
391372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
3914afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        runTestOnUiThread(new Runnable() {
3915afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu           @Override
3916afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            public void run() {
3917afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.setFocusable(true);
3918afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu               mTextView.requestFocus();
3919afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu            }
3920afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        });
3921afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        mInstrumentation.waitForIdleSync();
3922afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu        assertTrue(mTextView.isFocused());
392304d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu
392404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        new PollingCheck() {
392504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            @Override
392604d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            protected boolean check() {
392704d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu                return mTextView.isInputMethodTarget();
392804d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu            }
392904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu        }.run();
393072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
393172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
393372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
393472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
393672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
393772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
393872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
394072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
394172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
394272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
394372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
394572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
394672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
394772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
394972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
395072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
395172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
395272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
395372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
395572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
395672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
395772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
395872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
395972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
396172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
396272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
396472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
396572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
396672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
396872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
396972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
397072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
397172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
397372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
397472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
397572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
39769776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable d = getDrawable(R.drawable.pass);
397772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
397872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
398072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
398172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
398372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
3984c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        mTextView = new EditText(mActivity);
398572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
398672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
398872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
398972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
399072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
399172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
39920ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    public void testSelectAllJustAfterTap() {
39930ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Prepare an EditText with focus.
39940ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
39950ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
39960ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView = new EditText(mActivity);
39970ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mActivity.setContentView(mTextView);
39980ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
39990ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertFalse(mTextView.didTouchFocusSelect());
40000ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setFocusable(true);
40010ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.requestFocus();
40020ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                assertTrue(mTextView.didTouchFocusSelect());
40030ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
40040ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.setText("Hello, World.", BufferType.SPANNABLE);
40050ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
40060ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
40070ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
40080ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
40090ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Tap the view to show InsertPointController.
40100ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        TouchUtils.tapView(this, mTextView);
40110ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
40120ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // Execute SelectAll context menu.
40130ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mActivity.runOnUiThread(new Runnable() {
40140ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            public void run() {
40150ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka                mTextView.onTextContextMenuItem(android.R.id.selectAll);
40160ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka            }
40170ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        });
40180ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        mInstrumentation.waitForIdleSync();
40190ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
40200ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        // The selection must be whole of the text contents.
40210ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(0, mTextView.getSelectionStart());
40220ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka        assertEquals(mTextView.length(), mTextView.getSelectionEnd());
40230ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka    }
40240ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka
402572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
402672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
402772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
402872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
402972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
403072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
403172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
403272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
403372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
403472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
403572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
403672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
403772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
403872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
403972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
404072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
404172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
4042c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi
4043c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        // Tests for invalid arguments.
4044c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(request, null));
4045c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, outText));
4046c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi        assertFalse(mTextView.extractText(null, null));
404772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
404872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
404994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
405094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testTextDirectionDefault() {
4051c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
40522a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
405394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
405494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
405594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
405694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testSetGetTextDirection() {
4057c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
405894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
405994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
40602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection());
406194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
406294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
40632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection());
406494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
406594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
40662a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection());
406794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
406894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
40692a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection());
407094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
407194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
40722a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection());
407394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
407494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
40752a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection());
407602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
407702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
407802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection());
407902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
408002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
408102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection());
408294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
408394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
408494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
408594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtr() {
4086c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
408794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
408894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
40892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
409094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
409194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
40922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
409394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
409494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
40952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
409694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
409794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
40982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
409994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
410094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
41012a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
410294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
410394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
41042a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
410594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
410694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
41072a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
410802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
410902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
411002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
411102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
411202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
411302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
411494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
411594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
411694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
411794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionLtrWithInheritance() {
4118c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
411994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
412094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4121c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
412294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("this is a test");
412394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
412494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
412594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
41262a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
412794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
412894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
41292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
413094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
413194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
41322a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
413394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
413494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
41352a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
413694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
413794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
41382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
413994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
414094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
41412a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
414202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
414302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
414402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
414502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
414602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
414702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
414894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
414994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
415094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
415194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtl() {
4152c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
415394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
415494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
41552a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
415694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
415794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
41582a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
415994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
416094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
41612a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
416294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
416394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
41642a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
416594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
416694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
41672a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
416894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
416994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
41702a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
417194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
417294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
41732a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
417402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
417502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
417602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
417702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
417802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
417902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
418094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
418194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
418294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
418394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testGetResolvedTextDirectionRtlWithInheritance() {
4184c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = new LinearLayout(mActivity);
418594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
418694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4187c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = new TextView(mActivity);
418894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setText("\u05DD\u05DE"); // hebrew
418994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.addView(tv);
419094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
419194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
41922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
419394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
419494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
41952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
419694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
419794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
41982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
419994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
420094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
42012a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
420294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
420394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
42042a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
420594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
420694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
42072a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
420894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
420902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
421002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
421102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
421202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
421302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
421402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
421594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        // Force to RTL text direction on the layout
421694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
421794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
421894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG);
42192a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
422094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
422194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL);
42222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection());
422394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
422494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
42252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
422694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
422794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LTR);
42282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection());
422994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
423094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_RTL);
42312a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
423294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
423394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_LOCALE);
42342a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection());
423502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
423602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
423702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
423802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
423902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
424002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
424194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
424294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
424394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    @UiThreadTest
424494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    public void testResetTextDirection() {
4245c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest);
4246c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne        TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl);
424794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
424894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.setTextDirection(View.TEXT_DIRECTION_RTL);
424994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        tv.setTextDirection(View.TEXT_DIRECTION_INHERIT);
42502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
425194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
4252f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // No reset when we remove the view
425394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio        ll.removeView(tv);
4254f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection());
4255f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio
4256f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        // Reset is done when we add the view
4257f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio        ll.addView(tv);
42582a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio        assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection());
425994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio    }
426094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio
426102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
426202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongLtr() {
426302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
426402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
426502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
426602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
426702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
426802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
426902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
427002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
427102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
427202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
427302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
427402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
427502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
427602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
427702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
427802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
427902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
428002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
428102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
428202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
428302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
428402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
428502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
428602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
428702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
428802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
428902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
429002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
429102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
429202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
429302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
429402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
429502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is LTR.
429602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
429702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
429802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
429902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
430002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
430102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
430202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR);
430302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection());
430402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
430502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
430602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
430702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
430802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
430902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
431002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
431102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    @UiThreadTest
431202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    public void testTextDirectionFirstStrongRtl() {
431302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
431402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is LTR, the paragraph direction is LTR.
431502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
431602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
431702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
431802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("this is a test");
431902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
432002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
432102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
432202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
432302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
432402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
432502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
432602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0));
432702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
432802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
432902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is RTL, the paragraph direction is RTL.
433002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
433102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
433202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
433302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\u05DD\u05DE"); // Hebrew
433402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
433502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
433602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
433702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
433802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
433902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
434002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
434102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
434202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
434302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        {
434402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // The first directional character is not a strong directional character, the paragraph
434502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            // direction is RTL.
434602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            LinearLayout ll = new LinearLayout(mActivity);
434702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
434802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            TextView tv = new TextView(mActivity);
434902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setText("\uFFFD");  // REPLACEMENT CHARACTER. Neutral direction.
435002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            ll.addView(tv);
435102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
435202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL);
435302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection());
435402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
435502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            tv.onPreDraw();  // For freezing layout.
435602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            Layout layout = tv.getLayout();
435702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka            assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0));
435802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka        }
435902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka    }
436002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka
4361c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    public void testTextLocales() {
4362c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        TextView tv = new TextView(mActivity);
4363c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.getDefault(), tv.getTextLocale());
4364c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.getDefault(), tv.getTextLocales());
4365c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4366c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocale(Locale.CHINESE);
4367c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.CHINESE, tv.getTextLocale());
4368c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales());
4369c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4370c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        tv.setTextLocales(LocaleList.forLanguageTags("en,ja"));
4371c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale());
4372c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales());
4373c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4374c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4375c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocale(null);
4376c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to null should throw");
4377c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4378c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4379c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4380c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4381c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4382c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(null);
4383c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locales to null should throw");
4384c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4385c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4386c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4387c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4388c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        try {
4389c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            tv.setTextLocales(new LocaleList());
4390c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            fail("Setting the text locale to an empty list should throw");
4391c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        } catch (Throwable e) {
4392c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader            assertEquals(IllegalArgumentException.class, e.getClass());
4393c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader        }
4394c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader    }
4395c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader
4396b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    public void testAllCapsLocalization() {
4397b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        String testString = "abcdefghijklmnopqrstuvwxyz";
4398b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4399b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        // The capitalized characters of "i" on Turkish and Azerbaijani are different from English.
4400b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        Locale[] testLocales = {
4401b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("az", "AZ"),
4402b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("tr", "TR"),
4403b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            new Locale("en", "US"),
4404b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        };
4405b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4406b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        TextView tv = new TextView(mActivity);
4407b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        tv.setAllCaps(true);
4408b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        for (Locale locale: testLocales) {
4409b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            tv.setTextLocale(locale);
4410b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka            assertEquals("Locale: " + locale.getDisplayName(),
4411b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         testString.toUpperCase(locale),
4412b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka                         tv.getTransformationMethod().getTransformation(testString, tv).toString());
4413b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka        }
4414b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka    }
4415b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka
4416dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4417dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testTextAlignmentDefault() {
4418dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
44197fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4420dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // resolved default text alignment is GRAVITY
44217fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4422dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4423dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4424dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4425dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testSetGetTextAlignment() {
4426dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4427dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4428dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
44297fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4430dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4431dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
44327fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment());
4433dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4434dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
44357fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment());
4436dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4437dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
44387fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment());
4439dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4440dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
44417fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment());
4442dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4443dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
44447fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment());
4445dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4446dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4447dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4448dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignment() {
4449dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4450dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
44517fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4452dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4453757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test center alignment first so that we dont hit the default case
4454dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
44557fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4456dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4457757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        // Test the default case too
4458757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4459757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4460757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio
4461dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
44627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4463dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4464dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
44657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4466dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4467dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
44687fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4469dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4470dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
44717fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4472dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4473dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4474dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4475dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testGetResolvedTextAlignmentWithInheritance() {
4476dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = new LinearLayout(getActivity());
4477dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
4478dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4479dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = new TextView(getActivity());
4480dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.addView(tv);
4481dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4482dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // check defaults
44837fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment());
4484dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4485dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4486dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // set inherit and check that child is following parent
4487dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
44887fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment());
4489dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4490dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
44917fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4492dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4493dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
44947fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment());
4495dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4496dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
44977fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment());
4498dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4499dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
45007fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment());
4501dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4502dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
45037fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment());
4504dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4505dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        // now get rid of the inheritance but still change the parent
4506dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4507dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4508dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
45097fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4510dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4511dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
45127fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4513dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4514dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END);
45157fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4516dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4517dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
45187fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4519dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4520dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
45217fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4522dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4523dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4524dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    @UiThreadTest
4525dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    public void testResetTextAlignment() {
45264ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4527dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4528dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest);
4529dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_rtl);
4530dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4531dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
4532dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT);
45337fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
4534dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
45354f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // No reset when we remove the view
4536dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio        ll.removeView(tv);
45374f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment());
45384f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio
45394f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Reset is done when we add the view
45404f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        // Default text alignment is GRAVITY
45414f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio        ll.addView(tv);
45427fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio        assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment());
4543dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio    }
4544dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio
4545b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    @UiThreadTest
4546b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    public void testDrawableResolution() {
4547b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int LEFT = 0;
4548b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int TOP = 1;
4549b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int RIGHT = 2;
4550b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        final int BOTTOM = 3;
4551b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
45524ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
4553b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4554b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
4555b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
4556b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
4557b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4558b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4559b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4560b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4561b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4562b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4563b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4564b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4565b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4566b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4567b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 1.2: left / right drawable defined in default RTL mode
4568b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
4569b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4570b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4571b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4572b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4573b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4574b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4575b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4576b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4577b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4578b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4579b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4580b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.1: start / end drawable defined in LTR mode
4581b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_1);
4582b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4583b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4584b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4585b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4586b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4587b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4588b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4589b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4590b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4591b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4592b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4593b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 2.2: start / end drawable defined in RTL mode
4594b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_2_2);
4595b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4596b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4597b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4598b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4599b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4600b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4601b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4602b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4603b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4604b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4605b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4606b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.1: left / right / start / end drawable defined in LTR mode
4607b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4608b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4609b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4610b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4611b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4612b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4613b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4614b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4615b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4616b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4617b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4618b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4619b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 3.2: left / right / start / end drawable defined in RTL mode
4620b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4621b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4622b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4623b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4624b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4625b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4626b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4627b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4628b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4629b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4630b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4631b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4632b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.1: start / end drawable defined in LTR mode inside a layout
4633b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4634b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_1);
4635b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4636b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4637b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4638b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4639b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4640b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4641b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4642b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4643b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4644b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4645b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4646b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 4.2: start / end drawable defined in RTL mode inside a layout
4647b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4648b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_4_2);
4649b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4650b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4651b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4652b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4653b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4654b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4655b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4656b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4657b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4658b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4659b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4660b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout
4661b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4662b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_1);
4663b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4664b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4665b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4666b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4667b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4668b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4669b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4670b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4671b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4672b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4673b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4674b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout
4675b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        // that defines the layout direction
4676b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_3_2);
4677b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        drawables = tv.getCompoundDrawables();
4678b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
4679b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
4680b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
4681b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
4682b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
4683b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
4684b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
4685b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
4686b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
4687b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio    }
4688b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio
46899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    @UiThreadTest
46909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    public void testDrawableResolution2() {
46919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int LEFT = 0;
46929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int TOP = 1;
46939776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int RIGHT = 2;
46949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        final int BOTTOM = 3;
46959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
46964ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo        TextViewCtsActivity activity = getActivity();
46979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
46989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        // Case 1.1: left / right drawable defined in default LTR mode
46999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        TextView tv = (TextView) activity.findViewById(R.id.textview_drawable_1_1);
47009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        Drawable[] drawables = tv.getCompoundDrawables();
47019776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
47039776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
47049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
47059776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
47069776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
47079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
47089776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
47099776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
47109776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47119776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null);
47129776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
47159776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
47169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
47179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
47189776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
47199776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_drawable_1_2);
47219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
47249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
47259776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
47269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
47279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_green),
47289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[TOP]).getBitmap());
47299776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
47309776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[BOTTOM]).getBitmap());
47319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47329776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null);
47339776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
47369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
47379776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
47389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
47399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
47409776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv = (TextView) activity.findViewById(R.id.textview_ltr);
47429776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47439776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47449776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[LEFT]);
47459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
47469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
47479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
47489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47499776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, getDrawable(R.drawable.icon_red), null);
47509776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47519776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47529776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_blue),
47539776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
47549776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_red),
47559776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[RIGHT]).getBitmap());
47569776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
47579776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
47589776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47599776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null);
47609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        drawables = tv.getCompoundDrawables();
47619776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
47629776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        WidgetTestUtils.assertEquals(getBitmap(R.drawable.icon_yellow),
47639776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio                ((BitmapDrawable) drawables[LEFT]).getBitmap());
47649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[RIGHT]);
47659776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[TOP]);
47669776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        assertNull(drawables[BOTTOM]);
47679776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
47689776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
4769e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetBreakStrategy() {
4770e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
4771e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
47722751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        final PackageManager pm = getInstrumentation().getTargetContext().getPackageManager();
47732751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka
4774d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for
47752751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // TextView except for Android Wear. The default value for Android Wear is
47762751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        // BREAK_STRATEGY_BALANCED.
47772751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
47782751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // Android Wear
47792751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
47802751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        } else {
47812751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            // All other form factor.
47822751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka            assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
47832751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka        }
4784e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4785e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
4786e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy());
4787e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4788e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
4789e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy());
4790e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4791e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
4792e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy());
4793d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
4794d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        EditText et = new EditText(mActivity);
4795d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
4796d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for
4797d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        // EditText.
4798d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
4799d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
4800d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE);
4801d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy());
4802d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
4803d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY);
4804d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy());
4805d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi
4806d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED);
4807d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy());
4808e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
4809e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4810e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    public void testSetGetHyphenationFrequency() {
4811e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        TextView tv = new TextView(mActivity);
4812e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4813d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
4814e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4815e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
4816e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency());
4817e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4818e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL);
4819e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency());
4820e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
4821e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
4822e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka        assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency());
4823e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka    }
4824e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka
482532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomSelectionActionModeCallback() {
482632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        final String text = "abcde";
482732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
482832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
482932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView = new EditText(mActivity);
483032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mActivity.setContentView(mTextView);
483132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setText(text, BufferType.SPANNABLE);
483232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setTextIsSelectable(true);
483332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.requestFocus();
483432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.setSelected(true);
483532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
483632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
483732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
483832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
483932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
484032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomSelectionActionModeCallback());
484132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
484232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackBlockActionMode = new MockActionModeCallback(false);
484332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackBlockActionMode);
484432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackBlockActionMode,
484532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.getCustomSelectionActionModeCallback());
484632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
484732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
484832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
484932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
485032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
485132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
485232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
48538e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
485432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
485532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
485632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
485732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
485832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
485932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackBlockActionMode.getCreateCount());
486032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
486132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
486232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
486332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
486432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
486532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
486632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
486732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
486832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
486932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was blocked.
487032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(0, callbackBlockActionMode.getDestroyCount());
487132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
487232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Overwrite callback.
487332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callbackStartActionMode = new MockActionModeCallback(true);
487432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomSelectionActionModeCallback(callbackStartActionMode);
487532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callbackStartActionMode, mTextView.getCustomSelectionActionModeCallback());
487632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
487732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
487832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
487932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Set selection and try to start action mode.
488032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                final Bundle args = new Bundle();
488132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
488232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length());
48838e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette                mTextView.performAccessibilityAction(
488432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                        AccessibilityNodeInfo.ACTION_SET_SELECTION, args);
488532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
488632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
488732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
488832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
488932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
489032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getCreateCount());
489132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
489232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mActivity.runOnUiThread(new Runnable() {
489332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            public void run() {
489432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                // Remove selection and stop action mode.
489532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi                mTextView.onTextContextMenuItem(android.R.id.copy);
489632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            }
489732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        });
489832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mInstrumentation.waitForIdleSync();
489932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
490032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Action mode was started
490132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(1, callbackStartActionMode.getDestroyCount());
490232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
490332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
490432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    public void testSetAndGetCustomInseltionActionMode() {
490532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        initTextViewForTyping();
490632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // Check default value.
490732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertNull(mTextView.getCustomInsertionActionModeCallback());
490832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
490932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        MockActionModeCallback callback = new MockActionModeCallback(false);
491032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        mTextView.setCustomInsertionActionModeCallback(callback);
491132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        assertEquals(callback, mTextView.getCustomInsertionActionModeCallback());
491232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        // TODO(Bug: 22033189): Tests the set callback is actually used.
491332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    }
491432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
491532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    private static class MockActionModeCallback implements ActionMode.Callback {
491632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mCreateCount = 0;
491732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private int mDestroyCount = 0;
491832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        private final boolean mAllowToStartActionMode;
491932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
492032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public MockActionModeCallback(boolean allowToStartActionMode) {
492132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mAllowToStartActionMode = allowToStartActionMode;
492232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
492332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
492432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getCreateCount() {
492532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mCreateCount;
492632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
492732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
492832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public int getDestroyCount() {
492932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mDestroyCount;
493032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
493132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
493232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
493332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
493432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
493532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
493632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
493732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
493832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public void onDestroyActionMode(ActionMode mode) {
493932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mDestroyCount++;
494032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
494132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
494232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
494332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
494432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            mCreateCount++;
494532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return mAllowToStartActionMode;
494632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
494732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
494832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        @Override
494932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
495032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi            return false;
495132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi        }
495232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi    };
495332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi
495472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
495572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
495672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
495772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
495872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
495972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
496072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
496172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
496272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
496372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
496472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
496572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
496672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
4967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
4968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
4971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
4977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
4980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
4986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
4987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
4990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
4991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
49949776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return ((BitmapDrawable) getDrawable(resid)).getBitmap();
49959776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    }
49969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio
49979776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio    private Drawable getDrawable(int resid) {
49989776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio        return mActivity.getResources().getDrawable(resid);
4999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
5002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
5005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
5011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
5014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
5020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
5023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
5029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
5032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
5038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
5041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
5048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
5049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
5051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
5052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
5054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
5057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
5063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
5066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
5072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
5075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
5081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
5084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
5090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
5093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
5099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
5102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
5108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
5111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
5117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
5120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
5126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
5127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
5128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
5129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
5131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
5132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
5135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
5137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
5138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
5140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
5144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
5145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
5148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
5149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
5152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
5153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
5156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
5157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
5161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
5162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
5163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
5165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
5166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
5169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
5170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
5173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
5174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
5178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
5179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
5182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
5183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
5187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
5196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
5197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
5199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
5203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
5204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
5205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5206e1233dfb12fbfc0452d7680a161982577c7db106Gilles Debunne        public boolean hasCalledNewSpannable() {
5207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
5208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
5212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
5213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
5216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
5217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
5220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
5221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
5222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
5223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
5224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
5228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
5229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
5230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
5231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
5233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
5234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
5235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
5236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
5239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
5240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
5243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
5244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
5247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
5248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
5251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
5252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
5256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
5259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
5260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
5265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
5266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
5267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
5268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
5269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
5270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
5271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
5273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
5275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
5276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
5277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
5279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
5280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
5283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
5284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
5287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
5288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
5289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
5293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
5294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
5295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
5296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
5297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
5298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
5299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
5300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
5301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
5302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
5303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
5304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
5305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
5306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
5308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
5309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
5312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
5313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
5316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
5317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
5319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
5320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
5321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
5322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
5323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
5324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
5325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
5326277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5327277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    /**
5328277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     * A TextWatcher that converts the text to spaces whenever the text changes.
5329277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook     */
5330277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    private static class ConvertToSpacesTextWatcher implements TextWatcher {
5331277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        boolean mChangingText;
5332277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5333277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5334277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
5335277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5336277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5337277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5338277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void onTextChanged(CharSequence s, int start, int before, int count) {
5339277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5340277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook
5341277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        @Override
5342277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        public void afterTextChanged(Editable s) {
5343277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Avoid infinite recursion.
5344277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            if (mChangingText) {
5345277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                return;
5346277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5347277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = true;
5348277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            // Create a string of s.length() spaces.
5349277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            StringBuilder builder = new StringBuilder(s.length());
5350277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            for (int i = 0; i < s.length(); i++) {
5351277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook                builder.append(' ');
5352277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            }
5353277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            s.replace(0, s.length(), builder.toString());
5354277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook            mChangingText = false;
5355277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook        }
5356277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook    }
5357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
5358