TextViewTest.java revision 013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1
1fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/*
2fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Copyright (C) 2008 The Android Open Source Project
3fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
4fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Licensed under the Apache License, Version 2.0 (the "License");
5fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * you may not use this file except in compliance with the License.
6fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * You may obtain a copy of the License at
7fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
8fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *      http://www.apache.org/licenses/LICENSE-2.0
9fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su *
10fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Unless required by applicable law or agreed to in writing, software
11fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * distributed under the License is distributed on an "AS IS" BASIS,
12fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * See the License for the specific language governing permissions and
14fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * limitations under the License.
15fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
16fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
17fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Supackage android.widget.cts;
18fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
19fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport com.android.cts.stub.R;
20fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport com.android.internal.util.FastMath;
21fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
22fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport dalvik.annotation.TestLevel;
23fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport dalvik.annotation.TestTargetClass;
24fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport dalvik.annotation.TestTargetNew;
25fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport dalvik.annotation.TestTargets;
26fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport dalvik.annotation.ToBeFixed;
27fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
28fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport org.xmlpull.v1.XmlPullParserException;
29fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
30fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity;
31fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation;
32fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor;
33fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Context;
34fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent;
35fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList;
36fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException;
37fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap;
38fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Canvas;
39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color;
40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint;
41fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect;
42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface;
43fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable;
44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable;
45fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri;
46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle;
47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2;
4872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils;
49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest;
50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable;
51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter;
52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType;
53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout;
54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection;
55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable;
56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString;
57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint;
58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils;
59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextWatcher;
60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt;
61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod;
62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener;
63fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener;
64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener;
65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener;
66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener;
67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod;
68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod;
69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod;
70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener;
71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod;
72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener;
73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener;
74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod;
75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener.Capitalize;
76fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan;
77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.cts.MockURLSpanTestActivity;
78fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify;
79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics;
80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue;
81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu;
82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity;
83dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsuimport android.view.KeyCharacterMap;
84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent;
85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View;
86bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.view.ViewGroup;
87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.WindowManager;
88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu.ContextMenuInfo;
89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnCreateContextMenuListener;
90fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View.OnLongClickListener;
91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.animation.cts.DelayedCheck;
9272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection;
9372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo;
9472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText;
9572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest;
96bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.AbsoluteLayout;
97bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout;
98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller;
99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView;
100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType;
10172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener;
102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException;
104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/**
106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}.
107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */
108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su@TestTargetClass(TextView.class)
109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Supublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewStubActivity> {
110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView mTextView;
111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Activity mActivity;
112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Instrumentation mInstrumentation;
113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final String LONG_TEXT = "This is a really long string which exceeds "
114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "the width of the view.";
115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static final long TIMEOUT = 5000;
11622d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root    private CharSequence mTransformedText;
117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public TextViewTest() {
119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super("com.android.cts.stub", TextViewStubActivity.class);
120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @Override
123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    protected void setUp() throws Exception {
124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        super.setUp();
125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity = getActivity();
126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation = getInstrumentation();
127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "TextView",
133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.Context.class}
134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "TextView",
138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.Context.class, android.util.AttributeSet.class}
139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "TextView",
143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.Context.class, android.util.AttributeSet.class, int.class}
144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testConstructor() {
147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity);
148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null);
150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new TextView(mActivity, null, 0);
152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getText",
158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setText",
163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class}
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    @TestTargetNew(
179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getLineHeight",
181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineHeight() {
184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLineSpacing(1.2f, 1.5f);
188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineHeight() > 0);
189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getLayout",
194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLayout() {
197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER);
201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) {
207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // change the text of TextView.
209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("Hello, Android!");
210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveLayout();
211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(runnable.getLayout());
216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getKeyListener",
223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setKeyListener",
228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.method.KeyListener.class}
229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessKeyListener() {
232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("");
236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getKeyListener());
241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final KeyListener digitsKeyListener = DigitsKeyListener.getInstance();
243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(digitsKeyListener, mTextView.getKeyListener());
252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // press '-' key.
255dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("-");
256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // press '1' key.
259dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // press '.' key.
263dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync(".");
264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // press 'a' key.
267dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(qwertyKeyListener, mTextView.getKeyListener());
280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // press 'a' key.
283dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
284dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu
285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1a", mTextView.getText().toString());
286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMovementMethod",
292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.method.MovementMethod.class}
293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getMovementMethod",
297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessMovementMethod() {
301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified "
302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "coordinates, except constrains the X scrolling position to the horizontal "
303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "regions of the text that will be visible after scrolling to "
304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + "the specified Y position.";
305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionStart = 10;
306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int selectionEnd = LONG_TEXT.length();
307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance();
308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(movementMethod);
312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(LONG_TEXT, BufferType.EDITABLE);
313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(movementMethod, mTextView.getMovementMethod());
321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection has been removed.
326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText()));
328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMovementMethod(null);
332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection((Editable) mTextView.getText(),
333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        selectionStart, selectionEnd);
334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT,
343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                KeyEvent.KEYCODE_DPAD_UP);
344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the selection will not be changed.
345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText()));
346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText()));
347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "length",
352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testLength() {
356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is content";
359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content);
360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.length());
361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("");
363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.length());
367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setGravity",
373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getGravity",
378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessGravity() {
383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_gravity);
384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_default);
386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.LEFT, mTextView.getGravity());
387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_bottom);
389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.LEFT, mTextView.getGravity());
390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_right);
392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center);
395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_fill);
398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.gravity_center_vertical_right);
401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity());
402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity());
405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL);
406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL, mTextView.getGravity());
407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER);
408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.CENTER, mTextView.getGravity());
409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.NO_GRAVITY);
411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.LEFT, mTextView.getGravity());
412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity());
415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.FILL_VERTICAL);
417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Gravity.FILL_VERTICAL | Gravity.LEFT, mTextView.getGravity());
418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //test negative input value.
420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(-1);
421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getGravity());
422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setAutoLinkMask",
428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getAutoLinkMask",
433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessAutoLinkMask() {
437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text1 =
439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new SpannableString("URL: http://www.google.com. mailto: account@gmail.com");
440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.ALL);
443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text1, BufferType.EDITABLE);
444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, mTextView.getAutoLinkMask());
448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Spannable spanString = (Spannable) mTextView.getText();
450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("http://www.google.com", spans[0].getURL());
454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("mailto:account@gmail.com", spans[1].getURL());
455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text2 =
457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            new SpannableString("name: Jack. tel: +41 44 800 8999");
458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text2, BufferType.EDITABLE);
462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask());
466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spanString = (Spannable) mTextView.getText();
468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = spanString.getSpans(0, spanString.length(), URLSpan.class);
469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(spans);
470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("tel:+41448008999", spans[0].getURL());
472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_autolink);
474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone)
475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, getAutoLinkMask(R.id.autolink_default));
476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web));
477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email));
478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone));
479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all));
480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES,
481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound1));
482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS,
483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound2));
484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS,
485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound3));
486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL,
487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                getAutoLinkMask(R.id.autolink_compound4));
488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextSize",
494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {float.class}
495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTextSize",
499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextSize",
504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class, float.class}
505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextSize() {
508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f);
512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics),
513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f);
516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics),
517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f);
520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextSize by default unit "sp"
524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(20f);
525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics),
526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextSize(200f);
529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics),
530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTextSize(), 0.01f);
531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextColor",
537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCurrentTextColor",
542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTextColors",
547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextColor",
552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.res.ColorStateList.class}
553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setTextColor(ColorStateList) when param colors is null")
558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTextColor() {
559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.GREEN);
562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentTextColor());
563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors());
564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.BLACK);
566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors());
568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(Color.RED);
570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentTextColor());
571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors());
572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextColor(colors);
579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getTextColors());
580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentTextColor());
581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setTextColor(null);
585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should thrown exception if the colors is null");
586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e){
587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.SUFFICIENT,
592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTextColor",
593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.content.Context.class, android.content.res.TypedArray.class, int.class}
594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#getTextColor(Context, TypedArray, int) when param attrs is null")
598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColor() {
599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            TextView.getTextColor(mActivity, null, -1);
603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("There should be a NullPointerException thrown out.");
604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setHighlightColor",
611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1386429", explanation = "No getter to check the value.")
614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHighlightColor() {
615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHighlightColor(0x00ff00ff);
618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setShadowLayer",
624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {float.class, float.class, float.class, int.class}
625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "isPaddingOffsetRequired",
629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLeftPaddingOffset",
634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTopPaddingOffset",
639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getRightPaddingOffset",
644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getBottomPaddingOffset",
649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1386429", explanation = "No getter to check the shaow color value.")
653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetShadowLayer() {
654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the left and below the text
657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN);
658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getRightPaddingOffset());
662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, textView.getBottomPaddingOffset());
663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // shadow is placed to the right and above the text
665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN);
666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.isPaddingOffsetRequired());
667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getLeftPaddingOffset());
668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getTopPaddingOffset());
669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // no shadow
673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN);
674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.isPaddingOffsetRequired());
675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getLeftPaddingOffset());
676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getTopPaddingOffset());
677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getRightPaddingOffset());
678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getBottomPaddingOffset());
679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setSelectAllOnFocus",
684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class}
685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSelectAllOnFocus() {
688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_selectallonfocus);
689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String content = "This is the content";
690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String blank = "";
691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.selectAllOnFocus_default);
692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(content, BufferType.SPANNABLE);
703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(content.length(), mTextView.getSelectionEnd());
712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(blank, BufferType.SPANNABLE);
725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(true);
726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(blank.length(), mTextView.getSelectionEnd());
734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 0);
736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSelectAllOnFocus(false);
737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change the focus
738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        findTextView(R.id.selectAllOnFocus_dummy).requestFocus();
739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.isFocused());
740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestFocus();
741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.isFocused());
742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionEnd());
745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getPaint",
750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetPaint() {
753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextPaint tp = mTextView.getPaint();
755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(tp);
756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaintFlags(), tp.getFlags());
758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setLinksClickable",
764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {boolean.class}
765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLinksClickable",
769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinksClickable() {
774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_true);
780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.linksClickable_false);
783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(false);
786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getLinksClickable());
787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinksClickable(true);
789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLinksClickable());
790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getMovementMethod());
792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999");
794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS);
796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Movement method will be automatically set to LinkMovementMethod
799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod);
800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setHintTextColor",
806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getHintTextColors",
811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCurrentHintTextColor",
816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setHintTextColor",
821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.res.ColorStateList.class}
822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHintTextColor() {
825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using int values
827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.GREEN);
829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor());
830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors());
831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.BLUE);
833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors());
834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor());
835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(Color.RED);
837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors());
838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.RED, mTextView.getCurrentHintTextColor());
839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using ColorStateList
841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_focused}, new int[0] },
844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(colors);
846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getHintTextColors());
847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor());
848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // exceptional
850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHintTextColor(null);
851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHintTextColors());
852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor());
853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setLinkTextColor",
859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLinkTextColors",
864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setLinkTextColor",
869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.content.res.ColorStateList.class}
870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessLinkTextColor() {
873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.GRAY);
876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors());
877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.GRAY, mTextView.getPaint().linkColor);
878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.YELLOW);
880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors());
881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.YELLOW, mTextView.getPaint().linkColor);
882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(Color.WHITE);
884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors());
885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.WHITE, mTextView.getPaint().linkColor);
886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ColorStateList colors = new ColorStateList(new int[][] {
888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { android.R.attr.state_expanded}, new int[0] },
889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new int[] { Color.rgb(0, 255, 0), Color.BLACK });
890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(colors);
891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(colors, mTextView.getLinkTextColors());
892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLinkTextColor(null);
895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLinkTextColors());
896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Color.BLACK, mTextView.getPaint().linkColor);
897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setPaintFlags",
903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getPaintFlags",
908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessPaintFlags() {
912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG);
920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG,
921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getPaintFlags());
922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMinHeight",
928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMaxHeight",
933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setHeight",
938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMaxWidth",
943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMinWidth",
948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setWidth",
953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testHeightAndWidth() {
957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight + 1);
963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(originalHeight - 1);
966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(-1);
969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight + 1);
975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(originalHeight - 1);
978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(-1);
981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinHeight(0);
984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxHeight(Integer.MAX_VALUE);
985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight + 1);
987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight + 1, mTextView.getHeight());
988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight - 1);
990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight - 1, mTextView.getHeight());
991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(-1);
993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getHeight());
994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHeight(originalHeight);
996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalHeight, mTextView.getHeight());
997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth >> 3, mTextView.getWidth());
999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Min Width
1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth + 1);
1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinWidth(originalWidth - 1);
10069c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
10079c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(originalWidth - 1, mTextView.getWidth());
1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Width
1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth + 1);
1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth + 1, mTextView.getWidth());
1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(originalWidth - 1);
10159c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu        assertEquals(2, mTextView.getLineCount());
1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth - 1, mTextView.getWidth());
1017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setMinEms",
1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinEms() {
1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
10279c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu
1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms + 1);
1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth());
1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinEms(originalEms - 1);
1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setMaxEms",
1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxEms() {
1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms + 1);
1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(originalWidth, mTextView.getWidth());
1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxEms(originalEms - 1);
1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setEms",
1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEms() {
1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("check height", 1, mTextView.getLineCount());
1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalWidth = mTextView.getWidth();
1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalEms = originalWidth / mTextView.getLineHeight();
1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms + 1);
1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms + 1) * mTextView.getLineHeight(),
1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setEms(originalEms - 1);
1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((1 < mTextView.getLineCount()));
1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals((originalEms - 1) * mTextView.getLineHeight(),
1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getWidth());
1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setLineSpacing",
1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {float.class, float.class}
1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLineSpacing() {
1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLineHeight = mTextView.getLineHeight();
1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // normal
1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float add = 1.2f;
1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float mult = 1.4f;
1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 0.0f;
1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // abnormal
1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 1.4f;
1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = -1.2f;
1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = -1.4f;
1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = 1.2f;
1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = 0.0f;
1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(originalLineHeight * mult + add), mTextView.getLineHeight());
1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // edge
1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MIN_VALUE;
1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MIN_VALUE;
1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float expected = originalLineHeight * mult + add;
1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        add = Float.MAX_VALUE;
1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mult = Float.MAX_VALUE;
1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLineSpacing(add, mult);
1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        expected = originalLineHeight * mult + add;
1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(FastMath.round(expected), mTextView.getLineHeight());
1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.NOT_NECESSARY,
1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "onSaveInstanceState",
1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.NOT_NECESSARY,
1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "onRestoreInstanceState",
1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.os.Parcelable.class}
1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testInstanceState() {
1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
114572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.PARTIAL_COMPLETE,
1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setFreezesText",
1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {boolean.class}
1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
115072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.PARTIAL_COMPLETE,
1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getFreezesText",
1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFreezesText() throws Throwable {
1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(R.layout.textview_hint_linksclickable_freezestext);
1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_true);
1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(false);
1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getFreezesText());
1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final CharSequence text = "Hello, TextView.";
1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final URLSpan urlSpan = new URLSpan("ctstest://TextView/test");
117972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Instrumentation instrumentation = getInstrumentation();
1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT);
1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
119572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is removed.
1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
119872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
119972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(text.toString(), mTextView.getText().toString());
1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setFreezesText(true);
1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getFreezesText());
1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
121072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // TODO: How to simulate the TextView in frozen icicles.
1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(),
1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                null, false);
1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Uri uri = Uri.parse(urlSpan.getURL());
1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.startActivity(intent);
1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity = am.waitForActivityWithTimeout(TIMEOUT);
1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(newActivity);
1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        newActivity.finish();
122572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        instrumentation.removeMonitor(am);
1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text of TextView is still there.
1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.freezesText_false);
1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.toString(), mTextView.getText().toString());
1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setEditableFactory",
1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.text.Editable.Factory.class}
1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setEditableFactory(android.text.Editable.Factory) "
1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "when param factory is null")
1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetEditableFactory() {
1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockEditableFactory factory = new MockEditableFactory();
1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEditableFactory(factory);
1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.hasCalledNewEditable());
1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setKeyListener(DigitsKeyListener.getInstance());
1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.hasCalledNewEditable());
1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setEditableFactory(null);
1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setSpannableFactory",
1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.text.Spannable.Factory.class}
1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setSpannableFactory(android.text.Spannable.Factory) "
1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "when param factory is null")
1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetSpannableFactory() {
1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "sample";
1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockSpannableFactory factory = new MockSpannableFactory();
1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setSpannableFactory(factory);
1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text);
1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.getNewSpannableCalledCount());
1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.EDITABLE);
1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.getNewSpannableCalledCount());
1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(factory.getNewSpannableCalledCount());
1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.getNewSpannableCalledCount());
1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        factory.reset();
1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.NORMAL);
1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(factory.getNewSpannableCalledCount());
1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, factory.getSource());
1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setSpannableFactory(null);
1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("The factory can not set to null!");
1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "addTextChangedListener",
1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.TextWatcher.class}
1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "removeTextChangedListener",
1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.TextWatcher.class}
1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextChangedListener() {
1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher0 = new MockTextWatcher();
1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextWatcher watcher1 = new MockTextWatcher();
1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher0);
1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.addTextChangedListener(watcher1);
1340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called though the strings are same
1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Changed");
1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // BeforeTextChanged and OnTextChanged are called twice (The text is not
1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Editable, so in Append() it calls setText() first)
1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("and appended");
1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledBeforeTextChanged());
1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledOnTextChanged());
1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher1.hasCalledAfterTextChanged());
1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Methods are not called if the string does not change
1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("");
1378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledBeforeTextChanged());
1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledOnTextChanged());
1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher0.hasCalledAfterTextChanged());
1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher0.reset();
1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        watcher1.reset();
1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.removeTextChangedListener(watcher1);
1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(null);
1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledBeforeTextChanged());
1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledOnTextChanged());
1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(watcher0.hasCalledAfterTextChanged());
1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledBeforeTextChanged());
1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledOnTextChanged());
1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(watcher1.hasCalledAfterTextChanged());
1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setTextKeepState",
1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {java.lang.CharSequence.class}
1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextKeepState1() {
1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1);
1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, 4);
1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getSelectionEnd());
1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1);
1435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString);
1445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getEditableText",
1453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
1454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetEditableText() {
1457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "Hello";
1460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.EDITABLE);
1461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getEditableText().toString());
1464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(text, BufferType.SPANNABLE);
1466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text, tv.getText().toString());
1467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.EDITABLE);
1471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getEditableText().toString());
1474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(null, BufferType.SPANNABLE);
1476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(tv.getEditableText());
1479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setText",
1484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {char[].class, int.class, int.class}
1485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setText(char[], int, int) when param start or len makes "
1490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "the index out of bounds")
1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText2() {
1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = "This is a test for setting text content by char array";
1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        char[] input = string.toCharArray();
1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, input.length);
1497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string, tv.getText().toString());
1498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 0, 5);
1500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(string.substring(0, 5), tv.getText().toString());
1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, -1, input.length);
1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the start position is negative!");
1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 0, -1);
1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the length is negative!");
1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(input, 1, input.length);
1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if the end position is out of index!");
1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IndexOutOfBoundsException exception) {
1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(input, 1, 0);
1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", tv.getText().toString());
1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setText",
1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class, android.widget.TextView.BufferType.class}
1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextKeepState",
1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class, android.widget.TextView.BufferType.class}
1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText1() {
1538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String longString = "very long content";
1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String shortString = "short";
1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is inside the short string
1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString, BufferType.SPANNABLE);
1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 3);
1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionStart());
1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(3, mTextView.getSelectionEnd());
1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // selection is at the exact place which is outside the short string
1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), longString.length());
1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is inside the short string
1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1);
1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getSelectionStart());
1587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length() - 1, mTextView.getSelectionEnd());
1588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which ends outside the short string
1598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length());
1600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getSelectionStart());
1605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // select the sub string which is outside the short string
1616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(longString);
1617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(),
1618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                shortString.length() + 1, shortString.length() + 3);
1619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextKeepState(shortString, BufferType.EDITABLE);
1620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionStart());
1624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString.length(), mTextView.getSelectionEnd());
1625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(shortString, BufferType.EDITABLE);
1627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
1628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getText().toString());
1629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(shortString, mTextView.getEditableText().toString());
1630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no selection.
1631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionStart());
1632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getSelectionEnd());
1633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setText",
1638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
1639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setText(int) when param resid is illegal")
1644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText3() {
1645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId);
1651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1);
1655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setText",
1663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, android.widget.TextView.BufferType.class}
1664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setText(int, BufferType) when param resid is illegal")
1669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetText() {
1670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView tv = findTextView(R.id.textview_text);
1671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int resId = R.string.text_view_hint;
1673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String result = mActivity.getResources().getString(resId);
1674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.EDITABLE);
1676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Editable);
1678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        tv.setText(resId, BufferType.SPANNABLE);
1680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(result, tv.getText().toString());
1681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(tv.getText() instanceof Spannable);
1682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            tv.setText(-1, BufferType.EDITABLE);
1685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception with illegal id");
1686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setHint",
1694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class}
1695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setHint",
1699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
1700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getHint",
1704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
1705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
1708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessHint() {
1709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext);
1710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_linksClickable_freezesText_default);
1712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getHint());
1713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_blank);
1715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getHint());
1716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_string);
1718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint),
1719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.hint_resid);
1722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hint),
1723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint());
1724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint("This is hint");
1726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("This is hint", mTextView.getHint().toString());
1727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setHint(R.string.text_view_hello);
1729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
1730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHint().toString());
1731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Non-exist resid
1733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setHint(-1);
1735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw exception if id is illegal");
1736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NotFoundException e) {
1737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getError",
1744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
1745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setError",
1749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class}
1750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setError",
1754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class, android.graphics.drawable.Drawable.class}
1755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessError() {
1758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final String errorText = "Opps! There is an error";
1762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null);
1766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable icon = mActivity.getResources().getDrawable(R.drawable.failed);
1772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText, icon);
1775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // can not check whether the drawable is set correctly
1780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(null, null);
1784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance();
1790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(digitsKeyListener);
1793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setError(errorText);
1795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(errorText, mTextView.getError().toString());
1801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1802dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event that will not change the TextView's text
1804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("", mTextView.getText().toString());
1805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // The icon and error message will not be reset to null
1806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getError());
1807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1808dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("1");
1809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // a key event cause changes to the TextView's text
1810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("1", mTextView.getText().toString());
1811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the error message and icon will be cleared.
1812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getError());
1813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
1816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setFilters",
1819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.InputFilter[].class}
1820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
1821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
1822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
1823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getFilters",
1824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
1825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
1826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
1827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
1828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#setFilters(InputFilter[]) when param filters is null")
1830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessFilters() {
1831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final InputFilter[] expected = { new InputFilter.AllCaps(),
1832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                new InputFilter.LengthFilter(2) };
1833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
1835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
1836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
1839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
1840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
1841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setFilters(expected);
1842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
1843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(expected, mTextView.getFilters());
1848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1849dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
1850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("A", mTextView.getText().toString());
1852dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
1853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the text is capitalized by InputFilter.AllCaps
1854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1855dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("c");
1856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'C' could not be accepted, because there is a length filter.
1857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("AB", mTextView.getText().toString());
1858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.setFilters(null);
1861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw IllegalArgumentException!");
1862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (IllegalArgumentException e) {
1863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getFocusedRect",
1869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.graphics.Rect.class}
1870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete,"
1872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
1873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#getFocusedRect(Rect) when param rect is null")
1874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFocusedRect() {
1875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX(), rc.left);
1887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right);
1888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY(), rc.top);
1889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom);
1890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setSelected(true);
1894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                SpannableString text = new SpannableString(mTextView.getText());
1895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Selection.setSelection(text, 3, 13);
1896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText(text);
1897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getFocusedRect(rc);
1901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView.getLayout());
1902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getPrimaryHorizontal(13),
1903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                (float) rc.left, 0.01f);
1904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 'right' is one pixel larger than 'left'
1905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getPrimaryHorizontal(13) + 1,
1906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                (float) rc.right, 0.01f);
1907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineTop(0), rc.top);
1908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom);
1909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Exception
1911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
1912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.getFocusedRect(null);
1913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
1914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
1915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
1916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getLineCount",
1921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
1922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineCount() {
1924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // this is an one line text with default setting.
1926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multi-lines
1929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(mTextView.getWidth() / 3);
1930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(1 < mTextView.getLineCount());
1931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it to an one line
1933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMaxWidth(Integer.MAX_VALUE);
1934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set min lines don't effect the lines count for actual text.
1937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(12);
1938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
1939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the internal Layout has not been built.
1942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getLayout());
1943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineCount());
1944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getLineBounds",
1949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, android.graphics.Rect.class}
1950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetLineBounds() {
1952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Rect rc = new Rect();
1953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, null));
1955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getLineBounds(0, rc));
1957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.right);
1959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.bottom);
1961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null));
1964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.left);
1967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth(), rc.right);
1968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, rc.top);
1969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight(), rc.bottom);
1970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
1974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
1975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
1976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
1977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
1978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc));
1979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingLeft(), rc.left);
1980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right);
1981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getTotalPaddingTop(), rc.top);
1982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom);
1983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
1984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
1986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
1987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getBaseline",
1988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
1989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
1990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetBaseLine() {
1991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
1992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, mTextView.getBaseline());
1993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
1995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline());
1996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
1997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
1998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
1999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0);
2005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getBaseline());
2006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "onKeyDown",
2012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class, android.view.KeyEvent.class}
2013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "onKeyUp",
2017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class, android.view.KeyEvent.class}
2018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPressKey() {
2021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener
2022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = QwertyKeyListener.getInstance(false, Capitalize.NONE);
2023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView = findTextView(R.id.textview_text);
2026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setText("", BufferType.EDITABLE);
2028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2033dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("a");
2034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2035dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu        mInstrumentation.sendStringSync("b");
2036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("ab", mTextView.getText().toString());
2037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys(KeyEvent.KEYCODE_DEL);
2038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("a", mTextView.getText().toString());
2039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setIncludeFontPadding",
2044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class}
2045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetIncludeFontPadding() {
2047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(mTextView.getWidth() / 3);
2051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setPadding(1, 2, 3, 4);
2052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int oldHeight = mTextView.getHeight();
2058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setIncludeFontPadding(false);
2061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() < oldHeight);
2066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "computeScroll",
2072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setScroller",
2077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.widget.Scroller.class}
2078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testScroll() {
2081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //don't set the Scroller, nothing changed.
2087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollX());
2089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getScrollY());
2090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the Scroller
2092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Scroller s = new Scroller(mActivity);
2093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(s);
2094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.startScroll(0, 0, 320, 480, 0);
2095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.abortAnimation();
2096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        s.forceFinished(false);
2097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setScroller(s);
2098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.computeScroll();
2100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, mTextView.getScrollX());
2101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, mTextView.getScrollY());
2102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "debug",
2107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDebug() {
2110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(0);
2112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("Hello!");
2114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(mTextView);
2115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.debug(1);
2116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getSelectionStart",
2122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getSelectionEnd",
2127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "hasSelection",
2132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSelection() {
2136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String text = "This is the content";
2138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(text, BufferType.SPANNABLE);
2139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.selectAll((Spannable) mTextView.getText());
2142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getSelectionStart());
2143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(text.length(), mTextView.getSelectionEnd());
2144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionStart = 5;
2147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int selectionEnd = 7;
2148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart);
2149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionEnd());
2151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.hasSelection());
2152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd);
2154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionStart, mTextView.getSelectionStart());
2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(selectionEnd, mTextView.getSelectionEnd());
2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.hasSelection());
2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setEllipsize",
2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.TextUtils.TruncateAt.class}
2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getEllipsize",
2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessEllipsize() {
2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.setContentView(R.layout.textview_ellipsize);
2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_default);
2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_none);
2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_start);
2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.START, mTextView.getEllipsize());
2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_middle);
2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize());
2186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.ellipsize_end);
2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TruncateAt.END, mTextView.getEllipsize());
2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize());
2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.END);
2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize());
2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(null);
2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getEllipsize());
2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(10);
2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setEllipsize(TextUtils.TruncateAt.START);
2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord");
2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.invalidate();
2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize());
2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no method to check if '...yLongVeryLongWord' is painted in the screen.
2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setCursorVisible",
2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class}
2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1386429", explanation="No getter to check the value.")
2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetCursorVisible() {
2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(true);
2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCursorVisible(false);
2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onWindowFocusChanged",
2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class}
2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnWindowFocusChanged() {
2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onTouchEvent",
2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.view.MotionEvent.class}
2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTouchEvent() {
2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onTrackballEvent",
2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.view.MotionEvent.class}
2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTrackballEvent() {
2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.SUFFICIENT,
2253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTextColors",
2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.content.Context.class, android.content.res.TypedArray.class}
2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTextColors() {
2257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // TODO: How to get a suitable TypedArray to test this method.
2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
2262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onKeyShortcut",
2263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, android.view.KeyEvent.class}
2264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyShortcut() {
2266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
2267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "performLongClick",
2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testPerformLongClick() {
2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText("This is content");
2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener onLongClickListener = new MockOnLongClickListener(true);
2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener onCreateContextMenuListener
2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                = new MockOnCreateContextMenuListener(false);
2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(onCreateContextMenuListener.hasCreatedContextMenu());
2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onLongClickListener = new MockOnLongClickListener(false);
2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(onLongClickListener);
2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.performLongClick());
2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onLongClickListener.hasLongClicked());
2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnLongClickListener(null);
2295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        onCreateContextMenuListener = new MockOnCreateContextMenuListener(true);
2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setOnCreateContextMenuListener(onCreateContextMenuListener);
2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.performLongClick());
2298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(onCreateContextMenuListener.hasCreatedContextMenu());
2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getText",
2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCurrentHintTextColor",
2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCurrentTextColor",
2315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLinkTextColors",
2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTextScaleX",
2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTextSize",
2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTypeface",
2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getHintTextColors",
2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTextScaleX",
2345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {float.class}
2346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTypeface",
2350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.graphics.Typeface.class}
2351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTypeface",
2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.graphics.Typeface.class, int.class}
2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1386429", explanation = "mTextView.getTypeface() will be null "
2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "if typeface didn't be set or set to normal "
2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "and style didn't set or set to normal in xml."
2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "And there is no getter to check the highlight colour.")
2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testTextAttr() {
2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_textAttr);
2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getText
2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString());
2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getCurrentTextColor
2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getHintTextColors().getDefaultColor());
2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
2377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextScaleX
2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f);
2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // setTextScaleX
2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(2.4f);
2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f);
2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(0f);
2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0f, mTextView.getTextScaleX(), 0.01f);
2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextScaleX(- 2.4f);
2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f);
2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTextSize
2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface
2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // getTypeface will be null if android:typeface is not set or is set to normal,
2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // and android:style is not set or is set to normal
2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT);
2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.DEFAULT, mTextView.getTypeface());
2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face
2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null);
2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTypeface());
2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // default type face, bold style, note: the type face will be changed
2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // after call set method
2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // null type face, BOLD style
2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(null, Typeface.BOLD);
2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle());
2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // old type face, null style
2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTypeface(Typeface.DEFAULT, 0);
2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "append",
2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class}
2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "append",
2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {java.lang.CharSequence.class, int.class, int.class}
2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "should add @throws clause into javadoc of "
2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "TextView#append(CharSequence) when param text is null and should "
2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "add @throws clause into javadoc of TextView#append(CharSequence, int, int) "
2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "when param start or end is out of bounds")
2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAppend() {
2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 1: check the original length, should be blank as initialised.
2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getText().length());
2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 2: append a string use append(CharSquence) into the original blank
2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was
2445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // not already editable.
2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(mTextView.getText() instanceof Editable);
2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append.");
2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.", mTextView.getText().toString());
2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 3: append a string from 0~3.
2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 3);
2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 4: append a string from 0~0, nothing will be append as expected.
2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.append("Append", 0, 0);
2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals("Append.App", mTextView.getText().toString());
2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getText() instanceof Editable);
2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 5: append a string from -3~3. check the wrong left edge.
2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", -3, 3);
2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 6: append a string from 3~10. check the wrong right edge.
2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append("Append", 3, 10);
2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw StringIndexOutOfBoundsException");
2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (StringIndexOutOfBoundsException e) {
2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // 7: append a null string.
2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView.append(null);
2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException");
2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getTransformationMethod",
2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setTransformationMethod",
2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {android.text.method.TransformationMethod.class}
2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessTransformationMethod() {
2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the password attribute in xml
2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_password);
2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check the singleLine attribute in xml
2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_singleLine);
2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(mTextView);
2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(SingleLineTransformationMethod.getInstance(),
2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false,
2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                Capitalize.NONE);
2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final TransformationMethod method = PasswordTransformationMethod.getInstance();
2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // change transformation method by function
2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setKeyListener(qwertyKeyListener);
2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(method);
251622d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                mTransformedText = method.getTransformation(mTextView.getText(), mTextView);
2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.requestFocus();
2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(PasswordTransformationMethod.getInstance(),
2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getTransformationMethod());
2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        sendKeys("H E 2*L O");
2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.append(" ");
2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it will get transformed after a while
2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new DelayedCheck(TIMEOUT) {
2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // "******"
253822d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                return mTransformedText.toString()
253922d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root                        .equals("\u2022\u2022\u2022\u2022\u2022\u2022");
2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set null
2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setTransformationMethod(null);
2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(mTextView.getTransformationMethod());
2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setCompoundDrawablePadding",
2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setCompoundDrawables",
2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {Drawable.class, Drawable.class, Drawable.class, Drawable.class}
2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setCompoundDrawablesWithIntrinsicBounds",
2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {Drawable.class, Drawable.class, Drawable.class, Drawable.class}
2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setCompoundDrawablesWithIntrinsicBounds",
2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class, int.class, int.class, int.class}
2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundDrawablePadding",
2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundDrawables",
2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundPaddingBottom",
2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundPaddingLeft",
2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundPaddingRight",
2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getCompoundPaddingTop",
2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testCompound() {
2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int padding = 3;
2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable[] drawables = mTextView.getCompoundDrawables();
2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[0]);
2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[1]);
2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[2]);
2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test setCompoundDrawablePadding and getCompoundDrawablePadding
2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablePadding(padding);
2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(padding, mTextView.getCompoundDrawablePadding());
2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using resid, 0 represents null
2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass,
2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                R.drawable.failed, 0);
2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.start),
2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[0]).getBitmap());
2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass),
2629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[1]).getBitmap());
2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed),
2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                ((BitmapDrawable) drawables[2]).getBitmap());
2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable left = mActivity.getResources().getDrawable(R.drawable.blue);
2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable right = mActivity.getResources().getDrawable(R.drawable.yellow);
2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // using drawables directly
2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null);
2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(),
2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(),
2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(),
2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set bounds to drawables and set them again.
2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 1, 2);
2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 3, 4);
2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 5, 6);
2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // usinf drawables
2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, top, right, null);
2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        drawables = mTextView.getCompoundDrawables();
2669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableLeft
2671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(left, drawables[0]);
2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableTop
2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(top, drawables[1]);
2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableRight
2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(right, drawables[2]);
2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // drawableBottom
2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(drawables[3]);
2678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // check compound padding
2680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(),
2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingLeft());
2682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(),
2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingTop());
2684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(),
2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCompoundPaddingRight());
2686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom());
2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
2690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setSingleLine",
2693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
2694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
2695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
2697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setSingleLine",
2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {boolean.class}
2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSingleLine() {
2702013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final TextView textView = new TextView(mActivity);
2703013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        setSpannableText(textView, "This is a really long sentence"
2704013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                + " which can not be placed in one line on the screen.");
2705013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2706013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        // Narrow layout assures that the text will get wrapped.
2707013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        FrameLayout innerLayout = new FrameLayout(mActivity);
2708013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
2709013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        innerLayout.addView(textView);
2710013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2711013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
2712013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        layout.addView(innerLayout);
2713013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu
2714013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mActivity.runOnUiThread(new Runnable() {
2715013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            public void run() {
2716013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                mActivity.setContentView(layout);
2717013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(true);
2718013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu            }
2719013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        });
2720013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        mInstrumentation.waitForIdleSync();
2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2723013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2724013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineWidth = textView.getLayout().getWidth();
2725013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        int singleLineHeight = textView.getLayout().getHeight();
2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2729013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine(false);
2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2733013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(null, textView.getTransformationMethod());
2734013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getHeight() > singleLineHeight);
2735013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertTrue(textView.getLayout().getWidth() < singleLineWidth);
2736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // same behaviours as setSingLine(true)
2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2740013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.setSingleLine();
2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(SingleLineTransformationMethod.getInstance(),
2745013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu                textView.getTransformationMethod());
2746013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineHeight, textView.getLayout().getHeight());
2747013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu        assertEquals(singleLineWidth, textView.getLayout().getWidth());
2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setMaxLines",
2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLines() {
2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float[] widths = new float[LONG_TEXT.length()];
2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.getPaint().getTextWidths(LONG_TEXT, widths);
2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        float totalWidth = 0.0f;
2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        for (float f : widths) {
2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            totalWidth += f;
2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int stringWidth = (int) totalWidth;
2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(stringWidth >> 2);
2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(LONG_TEXT);
2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final int maxLines = 2;
2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > maxLines);
2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setMaxLines(maxLines);
2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.requestLayout();
2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight());
2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setMaxLines",
2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
278572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            + "this method should not accept neagtive values as maximum line count")
2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMaxLinesException() {
278772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
278872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(mTextView.getWidth() >> 3);
279072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setMaxLines(-1);
2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setMinLines",
2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetMinLines() {
2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalHeight = mTextView.getHeight();
2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines - 1);
2805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setMinLines(originalLines + 1);
2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setLines",
2814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLines() {
2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make it multiple lines
2819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 3);
2820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int originalLines = mTextView.getLineCount();
2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines - 1);
2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(originalLines + 1);
2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight());
2827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setLines",
2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class}
2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, "
283672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            + "this method should not accept neagtive values as maximum line count")
2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetLinesException() {
283872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
283972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mActivity.setContentView(mTextView);
284072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setWidth(mTextView.getWidth() >> 3);
284172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setLines(-1);
2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getExtendedPaddingTop",
2847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingTop() {
2851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingTop());
2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, top, null, null);
2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop());
2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.BOTTOM);
2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingTop() > 0);
2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getExtendedPaddingBottom",
2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetExtendedPaddingBottom() {
2875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getExtendedPaddingBottom());
2878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable bottom = mActivity.getResources().getDrawable(R.drawable.red);
2881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, null, bottom);
2883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom());
2884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setLines(mTextView.getLineCount() - 1);
2887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_VERTICAL);
2888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getExtendedPaddingBottom() > 0);
2890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTotalPaddingTop",
2895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingTop() {
2898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingTop());
2901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable top = mActivity.getResources().getDrawable(R.drawable.red);
2904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        top.setBounds(0, 0, 100, 10);
2905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, top, null, null);
2908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.BOTTOM);
2910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop());
2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = mTextView.getHeight()
2918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineTop(mTextView.getLineCount());
2920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingTop());
2921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTotalPaddingBottom",
2926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingBottom() {
2929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingBottom());
2932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final Drawable bottom = mActivity.getResources().getDrawable(R.drawable.red);
2935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        bottom.setBounds(0, 0, 100, 10);
2936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
2937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
2938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setCompoundDrawables(null, null, null, bottom);
2939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(mTextView.getLineCount() - 1);
2940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setGravity(Gravity.CENTER_VERTICAL);
2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
2943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
2944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom());
2945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change line count
2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setLines(mTextView.getLineCount() + 1);
2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        int expected = ((mTextView.getHeight()
2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingBottom()
2950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getExtendedPaddingTop()
2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1)
2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                + mTextView.getExtendedPaddingBottom();
2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(expected, mTextView.getTotalPaddingBottom());
2954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTotalPaddingLeft",
2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingLeft() {
2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingLeft());
2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable left = mActivity.getResources().getDrawable(R.drawable.red);
2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        left.setBounds(0, 0, 10, 100);
2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(left, null, null, null);
2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.RIGHT);
2972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft());
2977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
2978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
2980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
2981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getTotalPaddingRight",
2982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
2983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
2984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @UiThreadTest
2985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetTotalPaddingRight() {
2986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
2987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Initialized value
2988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getTotalPaddingRight());
2989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // After Set a Drawable
2991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Drawable right = mActivity.getResources().getDrawable(R.drawable.red);
2992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        right.setBounds(0, 0, 10, 100);
2993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setCompoundDrawables(null, null, right, null);
2994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setGravity(Gravity.CENTER_HORIZONTAL);
2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
2996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
2997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Change width
2998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setWidth(Integer.MAX_VALUE);
2999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight());
3000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getUrls",
3005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetUrls() {
3008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        URLSpan[] spans = mTextView.getUrls();
3011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, spans.length);
3012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String url = "http://www.google.com";
3014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String email = "name@gmail.com";
3015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        String string = url + " mailto:" + email;
3016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        SpannableString spannable = new SpannableString(string);
3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(url), 0, url.length(), 0);
3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, spans.length);
3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new URLSpan(email), 0, email.length(), 0);
3024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(url, spans[0].getURL());
3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(email, spans[1].getURL());
3030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test the situation that param what is not a URLSpan
3032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spannable.setSpan(new Object(), 0, 9, 0);
3033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setText(spannable, BufferType.SPANNABLE);
3034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        spans = mTextView.getUrls();
3035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, spans.length);
3036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setPadding",
3041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, int.class, int.class, int.class}
3042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetPadding() {
3044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(0, 1, 2, 4);
3047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, mTextView.getPaddingLeft());
3048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getPaddingTop());
3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(2, mTextView.getPaddingRight());
3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(4, mTextView.getPaddingBottom());
3051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setPadding(10, 20, 30, 40);
3053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(10, mTextView.getPaddingLeft());
3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20, mTextView.getPaddingTop());
3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(30, mTextView.getPaddingRight());
3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(40, mTextView.getPaddingBottom());
3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setTextAppearance",
3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.content.Context.class, int.class}
3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1386429", explanation = "There is no getter to check "
3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "the Highlight color value.")
3066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetTextAppearance() {
3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = new TextView(mActivity);
3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All);
3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(20f, mTextView.getTextSize(), 0.01f);
3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle());
3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.red),
3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors);
3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.black),
3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentTextColor());
3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.blue),
3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getCurrentHintTextColor());
3084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(mActivity.getResources().getColor(R.drawable.yellow),
3085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.getLinkTextColors().getDefaultColor());
3086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors);
3088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(17f, mTextView.getTextSize(), 0.01f);
3089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle());
3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style);
3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(null, mTextView.getTypeface());
3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onPreDraw",
3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPreDraw() {
3101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setHorizontallyScrolling",
3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class}
3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetHorizontallyScrolling() {
3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the text view has more than one line
3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mTextView = findTextView(R.id.textview_text);
3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setWidth(mTextView.getWidth() >> 1);
3113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(true);
3116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1, mTextView.getLineCount());
3117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        setHorizontallyScrolling(false);
3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(mTextView.getLineCount() > 1);
3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "computeHorizontalScrollRange",
3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeHorizontalScrollRange() {
3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange());
3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // set the layout
3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange());
3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "computeVerticalScrollRange",
3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testComputeVerticalScrollRange() {
3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // test when layout is null
3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getLayout());
3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.computeVerticalScrollRange());
3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setFrame(0, 0, 40, 50);
3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getHeight(), textView.computeVerticalScrollRange());
3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //set the layout
3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        layout(textView);
3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange());
3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "drawableStateChanged",
3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testDrawableStateChanged() {
3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.reset();
3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.refreshDrawableState();
3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.hasCalledDrawableStateChanged());
3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        notes = "This method always returns false.",
3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getDefaultEditable",
3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultEditable() {
3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultEditable() does nothing, and always return false.
3183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.getDefaultEditable());
3184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        notes = "This method always returns null.",
3189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "getDefaultMovementMethod",
3190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetDefaultMovementMethod() {
3193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //the TextView#getDefaultMovementMethod() does nothing, and always return null.
3196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getDefaultMovementMethod());
3197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onCreateContextMenu",
3202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.view.ContextMenu.class}
3203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnCreateContextMenu() {
3205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onDetachedFromWindow",
3211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {}
3212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDetachedFromWindow() {
3214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onDraw",
3220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {android.graphics.Canvas.class}
3221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnDraw() {
3223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onFocusChanged",
3229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {boolean.class, int.class, android.graphics.Rect.class}
3230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnFocusChanged() {
3232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onMeasure",
3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, int.class}
3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnMeasure() {
3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onTextChanged",
3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {java.lang.CharSequence.class, int.class, int.class, int.class}
3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnTextChanged() {
3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.COMPLETE,
3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "setFrame",
3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, int.class, int.class, int.class}
3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testSetFrame() {
3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockTextView textView = new MockTextView(mActivity);
3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a new size to this view
3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(0, 0, 320, 480));
3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameLeft());
3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0, textView.getFrameTop());
3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(320, textView.getFrameRight());
3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(480, textView.getFrameBottom());
3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //Assign a same size to this view
3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(textView.setFrame(0, 0, 320, 480));
3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        //negative input
3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.setFrame(-1, -1, -1, -1));
3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameLeft());
3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameTop());
3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameRight());
3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(-1, textView.getFrameBottom());
3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
3280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getRightFadingEdgeStrength",
3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLeftFadingEdgeStrength",
3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
3290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testGetFadingEdgeStrength() {
3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
3294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
3296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
3297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
3301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
3302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on right side if the text aligns left
3307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
3313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on left side if the text aligns right
3317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
3323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the text aligns center
3327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(1.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
3332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getRightFadingEdgeStrength",
3335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getLeftFadingEdgeStrength",
3340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setMarqueeRepeatLimit",
3345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
3346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setSelected",
3350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {boolean.class}
3351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
3352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
3353bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testMarquee() {
3355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        final MockTextView textView = new MockTextView(mActivity);
3356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(LONG_TEXT);
3357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setEllipsize(TruncateAt.MARQUEE);
3359bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
3360bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3361bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        final FrameLayout layout = new FrameLayout(mActivity);
3362bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu        layout.addView(textView);
3363bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu
3364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // make the fading to be shown
3365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setHorizontalFadingEdgeEnabled(true);
3366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3369bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu                mActivity.setContentView(layout);
3370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TestSelectedRunnable runnable = new TestSelectedRunnable(textView) {
3375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(-1);
3377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to start
3378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(true);
3380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to run
3386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // fading is shown on both sides if the marquee runs for a while
3387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new DelayedCheck(TIMEOUT) {
3388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return textView.getLeftFadingEdgeStrength() > 0.0f
3391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && textView.getRightFadingEdgeStrength() > 0.0f;
3392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
339572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float leftFadingEdgeStrength = textView.getLeftFadingEdgeStrength();
339672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final float rightFadingEdgeStrength = textView.getRightFadingEdgeStrength();
339772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
3398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // wait for the marquee to continue
3399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // the left fading becomes thicker while the right fading becomes thiner
3400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // as the text moves towards left
3401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        new DelayedCheck(TIMEOUT) {
3402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            @Override
3403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            protected boolean check() {
3404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                return leftFadingEdgeStrength < textView.getLeftFadingEdgeStrength()
3405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                        && rightFadingEdgeStrength > textView.getRightFadingEdgeStrength();
3406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }.run();
3408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected1());
3409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected2());
3410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        runnable = new TestSelectedRunnable(textView) {
3412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setMarqueeRepeatLimit(0);
3414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                // force the marquee to stop
3415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected1();
3416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setSelected(false);
3417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                saveIsSelected2();
3418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.LEFT);
3419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        };
3421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // force the marquee to stop
3422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(runnable);
3423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(runnable.getIsSelected1());
3425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertFalse(runnable.getIsSelected2());
3426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.RIGHT);
3432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f);
3436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f);
3437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
3439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
3440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                textView.setGravity(Gravity.CENTER_HORIZONTAL);
3441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
3442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
3443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
3444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // there is no left fading (Is it correct?)
3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f);
3446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getRightFadingEdgeStrength() > 0.0f);
3447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onKeyMultiple",
3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {int.class, int.class, android.view.KeyEvent.class}
3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnKeyMultiple() {
3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
3459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setInputExtras",
3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
3463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getInputExtras",
3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {boolean.class}
3468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
3469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
3470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @ToBeFixed(bug = "1569298", explanation = "NullPointerException occurs when we call "
3471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            + "android.widget.TextView#setInputExtras(int xmlResId)")
3472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessInputExtras() throws XmlPullParserException, IOException {
3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT);
3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // do not create the extras
3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getInputExtras(false));
3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // create if it does not exist
3481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        Bundle inputExtras = textView.getInputExtras(true);
3482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(inputExtras);
3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(inputExtras.isEmpty());
3484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // it is created already
3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNotNull(textView.getInputExtras(false));
3487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        try {
3489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            textView.setInputExtras(R.xml.input_extras);
3490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            fail("Should throw NullPointerException!");
3491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        } catch (NullPointerException e) {
3492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
3493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
3496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setInputType",
3499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
3500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getInputType",
3504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
3506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
3507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessContentType() {
3508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener);
3518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DateKeyListener);
3524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_DATETIME
3526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TimeKeyListener);
3530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_NUMBER
3532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true));
3538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_PHONE);
3540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof DialerKeyListener);
3542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE));
3548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.CHARACTERS));
3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.WORDS));
3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_CLASS_TEXT
3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertSame(textView.getKeyListener(),
3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                TextKeyListener.getInstance(false, Capitalize.SENTENCES));
3575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setInputType(InputType.TYPE_NULL);
3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_NULL, textView.getInputType());
3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getKeyListener() instanceof TextKeyListener);
3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargets({
3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "getInputType",
3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {}
3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        ),
3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @TestTargetNew(
3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            level = TestLevel.COMPLETE,
3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            method = "setRawInputType",
3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            args = {int.class}
3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        )
3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    })
3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testAccessRawContentType() {
3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        TextView textView = new TextView(mActivity);
3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setText(null, BufferType.EDITABLE);
3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setKeyListener(null);
3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setTransformationMethod(null);
3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL);
3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType());
3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE);
3608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType());
3610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_DATETIME
3614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME);
3615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_DATETIME
3616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType());
3617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_NUMBER
3621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED);
3623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_NUMBER
3624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_DECIMAL
3625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType());
3626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_PHONE);
3630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType());
3631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);
3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType());
3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getTransformationMethod());
3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setSingleLine();
3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_MULTI_LINE
3648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType());
3649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType());
3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_CLASS_TEXT
3660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertEquals(InputType.TYPE_CLASS_TEXT
3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType());
3663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        textView.setRawInputType(InputType.TYPE_NULL);
3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod);
3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        assertNull(textView.getKeyListener());
3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    @TestTargetNew(
3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        level = TestLevel.NOT_NECESSARY,
3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        method = "onPrivateIMECommand",
3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        args = {String.class, Bundle.class}
3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    )
3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    public void testOnPrivateIMECommand() {
3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        // Do not test. Implementation details.
3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
368072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargets({
368172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
368272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
368372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onAttachedToWindow",
368472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
368572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
368672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
368772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
368872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onBeginBatchEdit",
368972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
369072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
369172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
369272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
369372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onCheckIsTextEditor",
369472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
369572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
369672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
369772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
369872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onCommitCompletion",
369972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {android.view.inputmethod.CompletionInfo.class}
370072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
370172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
370272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
370372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onCreateInputConnection",
370472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {android.view.inputmethod.EditorInfo.class}
370572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
370672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
370772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
370872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onEditorAction",
370972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {int.class}
371072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
371172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
371272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
371372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onEndBatchEdit",
371472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
371572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
371672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
371772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
371872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onFinishTemporaryDetach",
371972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
372072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
372172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
372272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
372372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onSelectionChanged",
372472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {int.class, int.class}
372572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
372672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
372772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
372872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onStartTemporaryDetach",
372972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
373072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
373172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
373272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.NOT_NECESSARY,
373372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "onTextContextMenuItem",
373472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {int.class}
373572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        )
373672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    })
373772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testFoo() {
373872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // Do not test. Implementation details.
373972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
374072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
374172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
374272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
374372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "verifyDrawable",
374472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {android.graphics.drawable.Drawable.class}
374572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
374672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testVerifyDrawable() {
374772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
374872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
374972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Drawable d = mActivity.getResources().getDrawable(R.drawable.pass);
375072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(textView.verifyDrawable(d));
375172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
375272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, null);
375372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(textView.verifyDrawable(d));
375472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
375572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
375672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargets({
375772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
375872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
375972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "setPrivateImeOptions",
376072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {java.lang.String.class}
376172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
376272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
376372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
376472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "getPrivateImeOptions",
376572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
376672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        )
376772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    })
376872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessPrivateImeOptions() {
376972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
377072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
377172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
377272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3");
377372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions());
377472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
377572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setPrivateImeOptions(null);
377672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getPrivateImeOptions());
377772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
377872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
377972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
378072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
378172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "setOnEditorActionListener",
378272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {android.widget.TextView.OnEditorActionListener.class}
378372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
378472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetOnEditorActionListener() {
378572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
378672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
378772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockOnEditorActionListener listener = new MockOnEditorActionListener();
378872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
378972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setOnEditorActionListener(listener);
379172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(listener.isOnEditorActionCalled());
379272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE);
379472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(listener.isOnEditorActionCalled());
379572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
379672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
379772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargets({
379872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
379972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
380072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "setImeOptions",
380172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {int.class}
380272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
380372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
380472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
380572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "getImeOptions",
380672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
380772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        )
380872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    })
380972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeOptions() {
381072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
381172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
381272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
381372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_GO);
381472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions());
381572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
381672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE);
381772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions());
381872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
381972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeOptions(EditorInfo.IME_NULL);
382072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions());
382172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
382272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
382372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargets({
382472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
382572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
382672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "setImeActionLabel",
382772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {java.lang.CharSequence.class, int.class}
382872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
382972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
383072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
383172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "getImeActionLabel",
383272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
383372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
383472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
383572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
383672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "getImeActionId",
383772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
383872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        )
383972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    })
384072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testAccessImeActionLabel() {
384172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
384272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertNull(mTextView.getImeActionLabel());
384372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getImeActionId());
384472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
384572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setImeActionLabel("pinyin", 1);
384672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("pinyin", mTextView.getImeActionLabel().toString());
384772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(1, mTextView.getImeActionId());
384872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
384972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
385072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
385172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
385272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "setExtractedText",
385372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {android.view.inputmethod.ExtractedText.class}
385472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
385572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
385672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testSetExtractedText() {
385772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
385872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
385972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.getText().toString());
386072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
386172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText et = new ExtractedText();
386272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        et.text = "test";
386372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
386472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setExtractedText(et);
386572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals("test", mTextView.getText().toString());
386672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
386772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
386872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
386972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
387072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "moveCursorToVisibleOffset",
387172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
387272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
387372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testMoveCursorToVisibleOffset() throws Throwable {
387472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
387572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
387672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // not a spannable text
387772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
387872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
387972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
388072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
388172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
388272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
388372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
388472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a selection range
388572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        final String spannableText = "text";
388672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
388772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
388872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
388972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
389072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
389172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
389272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
389372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
389472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length());
389572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
389672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, mTextView.getSelectionStart());
389772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(spannableText.length(), mTextView.getSelectionEnd());
389872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
389972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
390072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertFalse(mTextView.moveCursorToVisibleOffset());
390172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
390272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
390372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
390472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
390572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        // a spannable without range
390672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
390772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
390872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView = findTextView(R.id.textview_text);
390972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                mTextView.setText(spannableText, BufferType.SPANNABLE);
391072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
391172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
391272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
391372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
391472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        runTestOnUiThread(new Runnable() {
391572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            public void run() {
391672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                assertTrue(mTextView.moveCursorToVisibleOffset());
391772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            }
391872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        });
391972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mInstrumentation.waitForIdleSync();
392072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
392172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
392272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
392372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
392472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "isInputMethodTarget",
392572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
392672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
392772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
392872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testIsInputMethodTarget() {
392972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
393072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isInputMethodTarget());
393172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.isFocused());
393372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
393472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
393572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.isFocused());
393672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
393772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.isInputMethodTarget());
393872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
393972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
394072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargets({
394172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
394272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
394372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "beginBatchEdit",
394472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
394572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ),
394672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @TestTargetNew(
394772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            level = TestLevel.COMPLETE,
394872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            method = "endBatchEdit",
394972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            args = {}
395072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        )
395172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    })
395272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete")
395372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBeginEndBatchEdit() {
395472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
395572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
395672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.beginBatchEdit();
395772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.endBatchEdit();
395872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
395972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
396072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
396172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.NOT_FEASIBLE,
396272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        notes = "it's hard to do unit test, should be tested by functional test",
396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "bringPointIntoView",
396472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {int.class}
396572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
396672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
396772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testBringPointIntoView() throws Throwable {
396872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
396972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(1));
397072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.layout(0, 0, 100, 100);
397272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.bringPointIntoView(2));
397372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
397472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
397572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
397672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.NOT_FEASIBLE,
397772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        notes = "it's hard to do unit test, should be tested by functional test",
397872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "cancelLongPress",
397972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
398072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
398172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testCancelLongPress() {
398272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
398372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        TouchUtils.longClickView(this, mTextView);
398472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.cancelLongPress();
398572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
398672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
398772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
398872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
398972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "clearComposingText",
399072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
399172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
399272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
399372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testClearComposingText() {
399472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
399572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setText("Hello world!", BufferType.SPANNABLE);
399672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Spannable text = (Spannable) mTextView.getText();
399772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
399872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
399972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
400072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
400172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        BaseInputConnection.setComposingSpans((Spannable) mTextView.getText());
400272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
400372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, BaseInputConnection.getComposingSpanStart(text));
400472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
400572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.clearComposingText();
400672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
400772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(-1, BaseInputConnection.getComposingSpanStart(text));
400872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
400972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
401072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
401172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.NOT_FEASIBLE,
401272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        notes = "it's hard to do unit test, should be tested by functional test",
401372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "computeVerticalScrollExtent",
401472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
401572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
401672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testComputeVerticalScrollExtent() {
401772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        MockTextView textView = new MockTextView(mActivity);
401872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
401972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
402072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        Drawable d = mActivity.getResources().getDrawable(R.drawable.pass);
402172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        textView.setCompoundDrawables(null, d, null, d);
402272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
402372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(0, textView.computeVerticalScrollExtent());
402472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
402572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
402672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
402772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
402872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "didTouchFocusSelect",
402972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {}
403072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
403172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @UiThreadTest
403272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testDidTouchFocusSelect() {
403372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
403472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertFalse(mTextView.didTouchFocusSelect());
403572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
403672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.setFocusable(true);
403772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView.requestFocus();
403872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.didTouchFocusSelect());
403972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
404072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
404172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @TestTargetNew(
404272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        level = TestLevel.COMPLETE,
404372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        method = "extractText",
404472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        args = {android.view.inputmethod.ExtractedTextRequest.class,
404572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                android.view.inputmethod.ExtractedText.class}
404672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    )
404772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    @ToBeFixed(bug = "", explanation = "even the TextView did not contains editable content, " +
404872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            "it also returns true.")
404972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    public void testExtractText() {
405072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = new TextView(mActivity);
405172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
405272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedTextRequest request = new ExtractedTextRequest();
405372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        ExtractedText outText = new ExtractedText();
405472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
405572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.token = 0;
405672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.flags = 10;
405772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxLines = 2;
405872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        request.hintMaxChars = 20;
405972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
406072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
406172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        mTextView = findTextView(R.id.textview_text);
406272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertTrue(mTextView.extractText(request, outText));
406372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
406472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        assertEquals(mActivity.getResources().getString(R.string.text_view_hello),
406572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach                outText.text.toString());
406672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
406772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
406872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    private static class MockOnEditorActionListener implements OnEditorActionListener {
406972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        private boolean isOnEditorActionCalled;
407072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
407172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
407272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            isOnEditorActionCalled = true;
407372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return true;
407472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
407572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
407672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        public boolean isOnEditorActionCalled() {
407772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return isOnEditorActionCalled;
407872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
407972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach    }
408072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
4081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final TextView textView) {
4082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(textView);
4085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void layout(final int layoutId) {
4091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mActivity.setContentView(layoutId);
4094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private TextView findTextView(int id) {
4100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return (TextView) mActivity.findViewById(id);
4101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private int getAutoLinkMask(int id) {
4104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return findTextView(id).getAutoLinkMask();
4105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private Bitmap getBitmap(int resid) {
4108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        return ((BitmapDrawable) mActivity.getResources().getDrawable(resid)).getBitmap();
4109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxWidth(final int pixels) {
4112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxWidth(pixels);
4115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinWidth(final int pixels) {
4121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinWidth(pixels);
4124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxHeight(final int pixels) {
4130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxHeight(pixels);
4133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinHeight(final int pixels) {
4139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinHeight(pixels);
4142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinLines(final int minlines) {
4148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinLines(minlines);
4151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And
4158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the buffer type is fixed to SPANNABLE.
4159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param tv the text view
4161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @param content the content
4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setSpannableText(final TextView tv, final String content) {
4164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                tv.setText(content, BufferType.SPANNABLE);
4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLines(final int lines) {
4173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLines(lines);
4176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHorizontallyScrolling(final boolean whether) {
4182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHorizontallyScrolling(whether);
4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setWidth(final int pixels) {
4191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setWidth(pixels);
4194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setHeight(final int pixels) {
4200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setHeight(pixels);
4203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMinEms(final int ems) {
4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMinEms(ems);
4212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setMaxEms(final int ems) {
4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setMaxEms(ems);
4221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setEms(final int ems) {
4227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setEms(ems);
4230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private void setLineSpacing(final float add, final float mult) {
4236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mActivity.runOnUiThread(new Runnable() {
4237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            public void run() {
4238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                mTextView.setLineSpacing(add, mult);
4239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        });
4241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        mInstrumentation.waitForIdleSync();
4242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestSelectedRunnable implements Runnable {
4245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
4246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected1;
4247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsSelected2;
4248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestSelectedRunnable(TextView textview) {
4250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
4251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected1() {
4254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected1;
4255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getIsSelected2() {
4258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mIsSelected2;
4259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected1() {
4262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected1 = mTextView.isSelected();
4263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveIsSelected2() {
4266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mIsSelected2 = mTextView.isSelected();
4267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static abstract class TestLayoutRunnable implements Runnable {
4271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private TextView mTextView;
4272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private Layout mLayout;
4273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public TestLayoutRunnable(TextView textview) {
4275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mTextView = textview;
4276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Layout getLayout() {
4279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLayout;
4280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void saveLayout() {
4283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mLayout = mTextView.getLayout();
4284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockEditableFactory extends Editable.Factory {
4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mhasCalledNewEditable;
4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledNewEditable() {
4292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mhasCalledNewEditable;
4293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = false;
4297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
4301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
4302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Editable newEditable(CharSequence source) {
4306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mhasCalledNewEditable = true;
4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
4308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newEditable(source);
4309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private class MockSpannableFactory extends Spannable.Factory {
4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledNewSpannable;
4314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private CharSequence mSource;
4315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean getNewSpannableCalledCount() {
4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledNewSpannable;
4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = false;
4322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = null;
4323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public CharSequence getSource() {
4326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mSource;
4327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public Spannable newSpannable(CharSequence source) {
4331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledNewSpannable = true;
4332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mSource = source;
4333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.newSpannable(source);
4334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextWatcher implements TextWatcher {
4338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledAfterTextChanged;
4339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledBeforeTextChanged;
4340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasOnTextChanged;
4341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset(){
4343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = false;
4344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = false;
4345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = false;
4346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledAfterTextChanged() {
4349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledAfterTextChanged;
4350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledBeforeTextChanged() {
4353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledBeforeTextChanged;
4354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
4357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasOnTextChanged;
4358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void afterTextChanged(Editable s) {
4361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledAfterTextChanged = true;
4362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
4365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledBeforeTextChanged = true;
4366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onTextChanged(CharSequence s, int start, int before, int count) {
4369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasOnTextChanged = true;
4370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnLongClick events. The class
4375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * that is interested in processing a mockOnLongClick event implements this
4376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * interface, and the object created with that class is registered with a
4377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * component using the component's
4378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnLongClickListener<code> method. When
4379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * the mockOnLongClick event occurs, that object's appropriate
4380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * method is invoked.
4381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnLongClickEvent
4383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnLongClickListener implements OnLongClickListener {
4385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mExpectedOnLongClickResult;
4386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasLongClicked;
4387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnLongClickListener(boolean result) {
4389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mExpectedOnLongClickResult = result;
4390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasLongClicked() {
4393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasLongClicked;
4394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onLongClick(View v) {
4397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasLongClicked = true;
4398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mExpectedOnLongClickResult;
4399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    /**
4403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * The listener interface for receiving mockOnCreateContextMenu events. The
4404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * class that is interested in processing a mockOnCreateContextMenu event
4405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * implements this interface, and the object created with that class is
4406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * registered with a component using the component's
4407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * <code>addMockOnCreateContextMenuListener<code> method. When the
4408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * mockOnCreateContextMenu event occurs, that object's appropriate method is
4409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * invoked.
4410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     *
4411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     * @see MockOnCreateContextMenuEvent
4412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su     */
4413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockOnCreateContextMenuListener implements OnCreateContextMenuListener {
4414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mIsMenuItemsBlank;
4415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCreatedContextMenu;
4416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        MockOnCreateContextMenuListener(boolean isBlank) {
4418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            this.mIsMenuItemsBlank = isBlank;
4419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCreatedContextMenu() {
4422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCreatedContextMenu;
4423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = false;
4427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
4430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCreatedContextMenu = true;
4431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            if (!mIsMenuItemsBlank) {
4432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su                menu.add("menu item");
4433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            }
4434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    private static class MockTextView extends TextView {
4438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnCreateContextMenu;
4439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnFocusChanged;
4440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnMeasure;
4441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnTextChanged;
4442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledDrawableStateChanged;
4443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnWindowFocusChanged;
4444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnPrivateIMECommand;
4445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        private boolean mHasCalledOnKeyMultiple;
4446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnWindowFocusChanged() {
4448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnWindowFocusChanged;
4449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnCreateContextMenu() {
4452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnCreateContextMenu;
4453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledDrawableStateChanged() {
4456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledDrawableStateChanged;
4457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnFocusChanged() {
4460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnFocusChanged;
4461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnMeasure() {
4464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnMeasure;
4465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnTextChanged() {
4468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnTextChanged;
4469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnPrivateIMECommand() {
4472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnPrivateIMECommand;
4473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean hasCalledOnKeyMultiple(){
4476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mHasCalledOnKeyMultiple;
4477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public MockTextView(Context context) {
4480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super(context);
4481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void reset() {
4484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnWindowFocusChanged = false;
4485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledDrawableStateChanged = false;
4486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnCreateContextMenu = false;
4487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnFocusChanged = false;
4488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnMeasure = false;
4489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnTextChanged = false;
4490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnPrivateIMECommand = false;
4491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnKeyMultiple = false;
4492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int computeHorizontalScrollRange() {
4496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.computeHorizontalScrollRange();
4497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int computeVerticalScrollRange() {
4501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.computeVerticalScrollRange();
4502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void drawableStateChanged() {
4506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.drawableStateChanged();
4507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledDrawableStateChanged = true;
4508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected boolean getDefaultEditable() {
4512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getDefaultEditable();
4513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected MovementMethod getDefaultMovementMethod() {
4517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getDefaultMovementMethod();
4518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onCreateContextMenu(ContextMenu menu) {
4522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onCreateContextMenu(menu);
4523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnCreateContextMenu = true;
4524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onDetachedFromWindow() {
4528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onDetachedFromWindow();
4529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onDraw(Canvas canvas) {
4533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onDraw(canvas);
4534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
4538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onFocusChanged(focused, direction, previouslyFocusedRect);
4539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnFocusChanged = true;
4540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
4544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnKeyMultiple = true;
4545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.onKeyMultiple(keyCode, repeatCount, event);
4546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
4550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
4551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnMeasure = true;
4552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected void onTextChanged(CharSequence text, int start, int before, int after) {
4556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onTextChanged(text, start, before, after);
4557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnTextChanged = true;
4558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected boolean setFrame(int l, int t, int r, int b) {
4562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.setFrame(l, t, r, b);
4563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public void onWindowFocusChanged(boolean hasWindowFocus) {
4567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            super.onWindowFocusChanged(hasWindowFocus);
4568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnWindowFocusChanged = true;
4569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected float getLeftFadingEdgeStrength() {
4573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getLeftFadingEdgeStrength();
4574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected float getRightFadingEdgeStrength() {
4578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getRightFadingEdgeStrength();
4579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public boolean onPrivateIMECommand(String action, Bundle data) {
4583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            mHasCalledOnPrivateIMECommand = true;
4584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.onPrivateIMECommand(action, data);
4585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public int getFrameLeft() {
4588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mLeft;
4589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public int getFrameTop() {
4592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mTop;
4593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public int getFrameRight() {
4596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mRight;
4597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        public int getFrameBottom() {
4600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return mBottom;
4601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int getBottomPaddingOffset() {
4605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getBottomPaddingOffset();
4606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int getLeftPaddingOffset() {
4610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getLeftPaddingOffset();
4611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int getRightPaddingOffset() {
4615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getRightPaddingOffset();
4616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected int getTopPaddingOffset() {
4620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.getTopPaddingOffset();
4621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
4622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su
4623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        @Override
4624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        protected boolean isPaddingOffsetRequired() {
4625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su            return super.isPaddingOffsetRequired();
4626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su        }
462772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
462872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @Override
462972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        protected boolean verifyDrawable(Drawable who) {
463072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return super.verifyDrawable(who);
463172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
463272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach
463372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        @Override
463472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        protected int computeVerticalScrollExtent() {
463572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach            return super.computeVerticalScrollExtent();
463672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach        }
4637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su    }
4638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su}
4639