TextViewTest.java revision 98d000ba45f2a9485e391b8a8abff1d891ea4dbb
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 19938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.annotation.IdRes; 20938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.annotation.NonNull; 21fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity; 22fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation; 23fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor; 24fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent; 252751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager; 26fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList; 27938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.content.res.Resources; 28fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException; 295bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinirimport android.cts.util.KeyEventUtil; 300162547f44173f0604d8a80143c128d9892460a1Kristian Monsenimport android.cts.util.PollingCheck; 31d82745ff4a8b174f7be1258fd329dedc52ce58bbChenjie Luoimport android.cts.util.WidgetTestUtils; 32fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Bitmap; 33fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color; 34fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint; 35afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path; 36fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff; 37fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect; 38afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF; 39fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface; 40fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable; 41ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable; 42fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable; 43fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri; 44fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle; 45265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList; 465b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable; 47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.ActivityInstrumentationTestCase2; 4872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.test.TouchUtils; 49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.test.UiThreadTest; 5098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.test.suitebuilder.annotation.MediumTest; 51ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.test.suitebuilder.annotation.SmallTest; 52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable; 53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter; 54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType; 55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout; 56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection; 57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable; 58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString; 59ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned; 60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint; 61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils; 62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt; 63afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher; 64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod; 65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener; 66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener; 67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener; 68fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener; 69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener; 70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod; 71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod; 72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod; 73fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener; 74fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod; 75fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener; 76afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize; 77fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener; 78fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod; 7998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan; 80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan; 81ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan; 82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify; 83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics; 84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue; 85ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode; 86fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu; 87afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo; 88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity; 89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent; 9032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu; 9132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.MenuItem; 92fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View; 93afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup; 9432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo; 9572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection; 9672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo; 9772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText; 9872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest; 99c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection; 100c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText; 101bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout; 10262808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout; 103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller; 104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView; 105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType; 10672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.widget.TextView.OnEditorActionListener; 107938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.widget.cts.util.TestUtils; 108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 109938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.invocation.InvocationOnMock; 110938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.stubbing.Answer; 111ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException; 112ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException; 114b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale; 115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 116938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport static org.mockito.Matchers.any; 117938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport static org.mockito.Mockito.*; 118938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/** 120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}. 121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 1224ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luopublic class TextViewTest extends ActivityInstrumentationTestCase2<TextViewCtsActivity> { 123fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Activity mActivity; 126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Instrumentation mInstrumentation; 127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final String LONG_TEXT = "This is a really long string which exceeds " 1287375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "the width of the view. New devices have a much larger screen which " 1297375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "actually enables long strings to be displayed with no fading. " 1307375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "I have made this string longer to fix this case. If you are correcting " 1317375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "this text, I would love to see the kind of devices you guys now use!"; 132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final long TIMEOUT = 5000; 13322d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root private CharSequence mTransformedText; 1345bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir private KeyEventUtil mKeyEventUtil; 135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TextViewTest() { 137a3e5fa456a01c74b91a5d66981433db598bcc9a7Agatha Man super("android.widget.cts", TextViewCtsActivity.class); 138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @Override 141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su protected void setUp() throws Exception { 142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su super.setUp(); 143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity = getActivity(); 144938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov PollingCheck.waitFor(() -> mActivity.hasWindowFocus()); 145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation = getInstrumentation(); 1465bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil = new KeyEventUtil(mInstrumentation); 147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 14928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook /** 15028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook * Promotes the TextView to editable and places focus in it to allow simulated typing. 15128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook */ 15228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook private void initTextViewForTyping() { 15328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mActivity.runOnUiThread(new Runnable() { 15428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook public void run() { 15528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView = findTextView(R.id.textview_text); 15628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 15728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView.setText("", BufferType.EDITABLE); 15828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView.requestFocus(); 15928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 16028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook }); 16128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mInstrumentation.waitForIdleSync(); 16228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 16328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testConstructor() { 165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new TextView(mActivity); 166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new TextView(mActivity, null); 168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 169938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, android.R.attr.textViewStyle); 170938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 171938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_Light_TextView); 172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessText() { 176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String expected = mActivity.getResources().getString(R.string.text_view_hello); 179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(expected); 180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, tv.getText().toString()); 181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null); 183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineHeight() { 187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(1.2f, 1.5f); 191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLayout() { 195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) { 205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the text of TextView. 207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello, Android!"); 208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveLayout(); 209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(runnable); 212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(runnable.getLayout()); 214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessKeyListener() { 218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getKeyListener()); 226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final KeyListener digitsKeyListener = DigitsKeyListener.getInstance(); 228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(digitsKeyListener); 232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(digitsKeyListener, mTextView.getKeyListener()); 236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(qwertyKeyListener); 242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(qwertyKeyListener, mTextView.getKeyListener()); 246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessMovementMethod() { 249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified " 250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "coordinates, except constrains the X scrolling position to the horizontal " 251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "regions of the text that will be visible after scrolling to " 252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "the specified Y position."; 253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionStart = 10; 254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionEnd = LONG_TEXT.length(); 255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance(); 256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(movementMethod); 260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT, BufferType.EDITABLE); 261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Editable) mTextView.getText(), 262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su selectionStart, selectionEnd); 263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(movementMethod, mTextView.getMovementMethod()); 269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT, 272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su KeyEvent.KEYCODE_DPAD_UP); 273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection has been removed. 274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText())); 276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(null); 280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Editable) mTextView.getText(), 281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su selectionStart, selectionEnd); 282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su sendKeys(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.KEYCODE_ALT_LEFT, 291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su KeyEvent.KEYCODE_DPAD_UP); 292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection will not be changed. 293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testLength() { 299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is content"; 302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content); 303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.length()); 304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(""); 306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessGravity() { 314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_gravity); 315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_default); 3174bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_bottom); 3204bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity()); 321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_right); 323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center); 326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_fill); 329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center_vertical_right); 332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity()); 333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity()); 336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL); 337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.NO_GRAVITY); 3424bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL_VERTICAL); 3484bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity()); 349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //test negative input value. 351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(-1); 352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getGravity()); 353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessAutoLinkMask() { 356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text1 = 358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("URL: http://www.google.com. mailto: account@gmail.com"); 359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.ALL); 362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text1, BufferType.EDITABLE); 363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, mTextView.getAutoLinkMask()); 367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Spannable spanString = (Spannable) mTextView.getText(); 369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("http://www.google.com", spans[0].getURL()); 373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("mailto:account@gmail.com", spans[1].getURL()); 374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text2 = 376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("name: Jack. tel: +41 44 800 8999"); 377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text2, BufferType.EDITABLE); 381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask()); 385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spanString = (Spannable) mTextView.getText(); 387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("tel:+41448008999", spans[0].getURL()); 391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_autolink); 393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone) 394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, getAutoLinkMask(R.id.autolink_default)); 395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web)); 396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email)); 397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone)); 398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all)); 399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES, 400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound1)); 401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, 402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound2)); 403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS, 404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound3)); 405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL, 406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound4)); 407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextSize() { 410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f); 414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics), 415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f); 418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics), 419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextSize by default unit "sp" 426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(20f); 427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(200f); 431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics), 432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextColor() { 436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.GREEN); 439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentTextColor()); 440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors()); 441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.BLACK); 443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors()); 445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.RED); 447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentTextColor()); 448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors()); 449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(colors); 456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getTextColors()); 457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(null); 462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should thrown exception if the colors is null"); 463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e){ 464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 467325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette public void testGetTextColor() { 468325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette // TODO: How to get a suitable TypedArray to test this method. 469325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 470325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette try { 471325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette TextView.getTextColor(mActivity, null, -1); 472325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette fail("There should be a NullPointerException thrown out."); 473325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } catch (NullPointerException e) { 474325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 475325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 476325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetHighlightColor() { 478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHighlightColor(0x00ff00ff); 481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetShadowLayer() { 484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the left and below the text 487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN); 488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.isPaddingOffsetRequired()); 489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getLeftPaddingOffset()); 490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getTopPaddingOffset()); 491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, textView.getRightPaddingOffset()); 492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, textView.getBottomPaddingOffset()); 493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the right and above the text 495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN); 496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.isPaddingOffsetRequired()); 497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getLeftPaddingOffset()); 498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getTopPaddingOffset()); 499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getRightPaddingOffset()); 500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getBottomPaddingOffset()); 501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // no shadow 503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN); 504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.isPaddingOffsetRequired()); 505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getLeftPaddingOffset()); 506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getTopPaddingOffset()); 507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getRightPaddingOffset()); 508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getBottomPaddingOffset()); 509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSelectAllOnFocus() { 513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_selectallonfocus); 514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is the content"; 515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String blank = ""; 516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.selectAllOnFocus_default); 517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content, BufferType.SPANNABLE); 528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.getSelectionEnd()); 537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(blank.length(), mTextView.getSelectionEnd()); 559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetPaint() { 573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextPaint tp = mTextView.getPaint(); 575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(tp); 576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaintFlags(), tp.getFlags()); 578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinksClickable() { 582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_true); 588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_false); 591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(false); 594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(true); 597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999"); 602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Movement method will be automatically set to LinkMovementMethod 607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod); 608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHintTextColor() { 611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using int values 613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.GREEN); 615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor()); 616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors()); 617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.BLUE); 619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors()); 620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor()); 621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.RED); 623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors()); 624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentHintTextColor()); 625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(colors); 632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getHintTextColors()); 633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor()); 634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(null); 637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHintTextColors()); 638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor()); 639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinkTextColor() { 642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.GRAY); 645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors()); 646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GRAY, mTextView.getPaint().linkColor); 647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.YELLOW); 649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors()); 650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.YELLOW, mTextView.getPaint().linkColor); 651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.WHITE); 653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors()); 654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.WHITE, mTextView.getPaint().linkColor); 655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_expanded}, new int[0] }, 658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(colors); 660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getLinkTextColors()); 661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(null); 664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLinkTextColors()); 665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessPaintFlags() { 669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 67053959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG 67153959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags()); 672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG); 674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG, 675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG); 678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG, 679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testHeightAndWidth() { 683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalWidth = mTextView.getWidth(); 685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalHeight = mTextView.getHeight(); 687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(originalHeight + 1); 689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 69098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalHeight + 1, mTextView.getMaxHeight()); 691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(originalHeight - 1); 693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight - 1, mTextView.getHeight()); 69498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalHeight - 1, mTextView.getMaxHeight()); 695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(-1); 697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 69898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 70298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Integer.MAX_VALUE, mTextView.getMaxHeight()); 703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(originalHeight + 1); 705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight + 1, mTextView.getHeight()); 70698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalHeight + 1, mTextView.getMinHeight()); 707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(originalHeight - 1); 709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 71098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalHeight - 1, mTextView.getMinHeight()); 711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(-1); 713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 71498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(0); 717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight + 1); 720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight + 1, mTextView.getHeight()); 721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight - 1); 723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight - 1, mTextView.getHeight()); 724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(-1); 726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight); 729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth >> 3, mTextView.getWidth()); 732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Min Width 734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth + 1); 735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth + 1, mTextView.getWidth()); 73798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalWidth + 1, mTextView.getMinWidth()); 738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth - 1); 7409c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 7419c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(originalWidth - 1, mTextView.getWidth()); 74298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalWidth - 1, mTextView.getMinWidth()); 743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Width 745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(originalWidth + 1); 746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth + 1, mTextView.getWidth()); 748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(originalWidth - 1); 7509c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth - 1, mTextView.getWidth()); 752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMinEms() { 755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 7579c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu 758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalWidth = mTextView.getWidth(); 759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalEms = originalWidth / mTextView.getLineHeight(); 760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms + 1); 762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 76398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 76498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms - 1); 767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 76898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 76998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxEms() { 773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalWidth = mTextView.getWidth(); 776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalEms = originalWidth / mTextView.getLineHeight(); 777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms + 1); 779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 78198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 78298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms - 1); 785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms - 1) * mTextView.getLineHeight(), 787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getWidth()); 78898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 78998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEms() { 793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("check height", 1, mTextView.getLineCount()); 795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalWidth = mTextView.getWidth(); 796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalEms = originalWidth / mTextView.getLineHeight(); 797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms + 1); 799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), 801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getWidth()); 80298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 80398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 80498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 80598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms - 1); 808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((1 < mTextView.getLineCount())); 809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms - 1) * mTextView.getLineHeight(), 810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getWidth()); 81198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 81298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 81398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 81498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLineSpacing() { 818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLineHeight = mTextView.getLineHeight(); 820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float add = 1.2f; 823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float mult = 1.4f; 824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 82592e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 0.0f; 827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 82992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // abnormal 832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 83592e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = -1.4f; 838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 83992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 1.2f; 841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 0.0f; 842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 84392e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // edge 846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MIN_VALUE; 847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MIN_VALUE; 848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 849ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 850ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette 851ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // edge case where the behavior of Math.round() deviates from 852ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // FastMath.round(), requiring us to use an explicit 0 value 853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MAX_VALUE; 854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MAX_VALUE; 855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 856ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(0, mTextView.getLineHeight()); 857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 859ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien public void testSetElegantLineHeight() { 860ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView = findTextView(R.id.textview_text); 861ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 862ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mActivity.runOnUiThread(new Runnable() { 863ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien public void run() { 864ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView.setWidth(mTextView.getWidth() / 3); 865ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView.setPadding(1, 2, 3, 4); 866ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView.setGravity(Gravity.BOTTOM); 867ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 868ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 869ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 870ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 871ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien int oldHeight = mTextView.getHeight(); 872ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mActivity.runOnUiThread(new Runnable() { 873ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien public void run() { 874ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView.setElegantTextHeight(true); 875ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 876ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 877ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 878ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 879ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getPaint().isElegantTextHeight()); 880ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() > oldHeight); 881ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 882ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mActivity.runOnUiThread(new Runnable() { 883ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien public void run() { 884ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView.setElegantTextHeight(false); 885ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 886ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 887ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 888ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 889ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() == oldHeight); 890ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 891ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testInstanceState() { 893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFreezesText() throws Throwable { 897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_hint_linksclickable_freezestext); 898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_true); 903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(false); 909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = "Hello, TextView."; 912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final URLSpan urlSpan = new URLSpan("ctstest://TextView/test"); 92072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Instrumentation instrumentation = getInstrumentation(); 922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ActivityMonitor am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Uri uri = Uri.parse(urlSpan.getURL()); 928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Intent intent = new Intent(Intent.ACTION_VIEW, uri); 929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.startActivity(intent); 930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT); 934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(newActivity); 935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 93672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach instrumentation.removeMonitor(am); 937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is removed. 938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 93972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 94072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(text.toString(), mTextView.getText().toString()); 941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(true); 943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 95172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su am = instrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Uri uri = Uri.parse(urlSpan.getURL()); 958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Intent intent = new Intent(Intent.ACTION_VIEW, uri); 959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.startActivity(intent); 960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 96307b9d3406e116f2f6b92932925783eed79503de0Mist Liao Activity oldActivity = newActivity; 96407b9d3406e116f2f6b92932925783eed79503de0Mist Liao while (true) { 96507b9d3406e116f2f6b92932925783eed79503de0Mist Liao newActivity = am.waitForActivityWithTimeout(TIMEOUT); 96607b9d3406e116f2f6b92932925783eed79503de0Mist Liao assertNotNull(newActivity); 96707b9d3406e116f2f6b92932925783eed79503de0Mist Liao if (newActivity != oldActivity) { 96807b9d3406e116f2f6b92932925783eed79503de0Mist Liao break; 96907b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 97007b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 97272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach instrumentation.removeMonitor(am); 973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is still there. 974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.toString(), mTextView.getText().toString()); 976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEditableFactory() { 979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 98298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Editable.Factory mockEditableFactory = spy(new Editable.Factory()); 98398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockEditableFactory).newEditable(any(CharSequence.class)); 98498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setEditableFactory(mockEditableFactory); 98598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 98798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 98998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 99198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 99398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 99598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 99798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 99998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(DigitsKeyListener.getInstance()); 100298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 100498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEditableFactory(null); 1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSpannableFactory() { 1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 101798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Spannable.Factory mockSpannableFactory = spy(new Spannable.Factory()); 101898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockSpannableFactory).newSpannable(any(CharSequence.class)); 101998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setSpannableFactory(mockSpannableFactory); 102098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 102298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 102498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 102698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 102898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 103098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 103298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 103498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 103798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 103998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSpannableFactory(null); 1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextChangedListener() { 1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher0 = new MockTextWatcher(); 1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher1 = new MockTextWatcher(); 1052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher0); 1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher1); 1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called though the strings are same 1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called twice (The text is not 1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Editable, so in Append() it calls setText() first) 1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("and appended"); 1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Methods are not called if the string does not change 1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(""); 1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledBeforeTextChanged()); 1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledOnTextChanged()); 1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledAfterTextChanged()); 1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.removeTextChangedListener(watcher1); 1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetTextKeepState1() { 1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1); 1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, 4); 1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getSelectionEnd()); 1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1); 1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetEditableText() { 1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "Hello"; 1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.EDITABLE); 1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getEditableText().toString()); 1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.SPANNABLE); 1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.EDITABLE); 1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getEditableText().toString()); 1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.SPANNABLE); 1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText2() { 1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = "This is a test for setting text content by char array"; 1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su char[] input = string.toCharArray(); 1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, input.length); 1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string, tv.getText().toString()); 1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, 5); 1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string.substring(0, 5), tv.getText().toString()); 1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, -1, input.length); 1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the start position is negative!"); 1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, -1); 1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the length is negative!"); 1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, input.length); 1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the end position is out of index!"); 1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, 0); 1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText1() { 1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), longString.length()); 1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1); 1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length() - 1, mTextView.getSelectionEnd()); 1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length()); 1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText3() { 1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId); 1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1); 1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 133698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir @MediumTest 133798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir public void testSetText_updatesHeightAfterRemovingImageSpan() { 133898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // Height calculation had problems when TextView had width: match_parent 133998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT; 134098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final Spannable text = new SpannableString("some text"); 134198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int spanHeight = 100; 134298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 134398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // prepare TextView, width: MATCH_PARENT 134498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir TextView textView = new TextView(getActivity()); 134598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setSingleLine(true); 134698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2); 134798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setPadding(0, 0, 0, 0); 134898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setIncludeFontPadding(false); 134998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setText(text); 135098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 135198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth, 135298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 135398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.addView(textView, layoutParams); 135498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.setLayoutParams(layoutParams); 135598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mActivity.runOnUiThread(new Runnable() { 135698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir @Override 135798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir public void run() { 135898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir getActivity().setContentView(layout); 135998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 136098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir }); 136198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir getInstrumentation().waitForIdleSync(); 136298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 136398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height of text with no span 136498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int heightWithoutSpan = textView.getHeight(); 136598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be smaller than span height", 136698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan < spanHeight); 136798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 136898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // add ImageSpan to text 136998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery); 137098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir drawable.setBounds(0, 0, spanHeight, spanHeight); 137198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ImageSpan span = new ImageSpan(drawable); 137298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 137398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mActivity.runOnUiThread(new Runnable() { 137498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir @Override 137598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir public void run() { 137698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setText(text); 137798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 137898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir }); 137998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 138098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 138198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height with span 138298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int heightWithSpan = textView.getHeight(); 138398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be greater or equal than span height", 138498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithSpan >= spanHeight); 138598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 138698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // remove the span 138798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.removeSpan(span); 138898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mActivity.runOnUiThread(new Runnable() { 138998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir @Override 139098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir public void run() { 139198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir textView.setText(text); 139298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 139398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir }); 139498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 139598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 139698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int heightAfterRemoveSpan = textView.getHeight(); 139798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertEquals("Text height should be same after removing the span", 139898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan, heightAfterRemoveSpan); 139998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 140098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 1401af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi public void testRemoveSelectionWithSelectionHandles() { 1402af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi initTextViewForTyping(); 1403af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1404af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mActivity.runOnUiThread(new Runnable() { 1405af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi @Override 1406af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi public void run() { 1407af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mTextView.setTextIsSelectable(true); 1408af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mTextView.setText("abcd", BufferType.EDITABLE); 1409af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1410af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1411af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1412af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1413af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Long click on the text selects all text and shows selection handlers. The view has an 1414af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // attribute layout_width="wrap_content", so clicked location (the center of the view) 1415af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // should be on the text. 1416af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi TouchUtils.longClickView(this, mTextView); 1417af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1418af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mActivity.runOnUiThread(new Runnable() { 1419af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi @Override 1420af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi public void run() { 1421af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi Selection.removeSelection((Spannable) mTextView.getText()); 1422af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1423af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1424af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1425af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Make sure that a crash doesn't happen with {@link Selection#removeSelection}. 1426af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1427af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1428af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1429c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_insert() { 143028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook initTextViewForTyping(); 14315b51f77b99861d48fec1c327252416f726b3b01aJames Cook 14325b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text. 14335bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 14345b51f77b99861d48fec1c327252416f726b3b01aJames Cook mActivity.runOnUiThread(new Runnable() { 14355b51f77b99861d48fec1c327252416f726b3b01aJames Cook public void run() { 143628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Precondition: The cursor is at the end of the text. 143728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(3, mTextView.getSelectionStart()); 14385b51f77b99861d48fec1c327252416f726b3b01aJames Cook 14395b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Undo removes the typed string in one step. 14405b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 14415b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 144228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(0, mTextView.getSelectionStart()); 14435b51f77b99861d48fec1c327252416f726b3b01aJames Cook 144428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Redo restores the text and cursor position. 14455b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.redo); 14465b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("abc", mTextView.getText().toString()); 144728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(3, mTextView.getSelectionStart()); 14485b51f77b99861d48fec1c327252416f726b3b01aJames Cook 14495b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Undoing the redo clears the text again. 14505b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 14515b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 14525b51f77b99861d48fec1c327252416f726b3b01aJames Cook 14535b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Undo when the undo stack is empty does nothing. 14545b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 14555b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 14565b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 14575b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 14585b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 145928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 14605b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1461c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_delete() { 146228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook initTextViewForTyping(); 14635b51f77b99861d48fec1c327252416f726b3b01aJames Cook 146428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Simulate deleting text and undoing it. 14655bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "xyz"); 14665bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, 14675bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir KeyEvent.KEYCODE_DEL); 14685b51f77b99861d48fec1c327252416f726b3b01aJames Cook mActivity.runOnUiThread(new Runnable() { 14695b51f77b99861d48fec1c327252416f726b3b01aJames Cook public void run() { 147028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Precondition: The text was actually deleted. 147128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals("", mTextView.getText().toString()); 147228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(0, mTextView.getSelectionStart()); 147328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 147428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Undo restores the typed string and cursor position in one step. 14755b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 147628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals("xyz", mTextView.getText().toString()); 147728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(3, mTextView.getSelectionStart()); 14785b51f77b99861d48fec1c327252416f726b3b01aJames Cook 147928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Redo removes the text in one step. 148028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView.onTextContextMenuItem(android.R.id.redo); 148128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals("", mTextView.getText().toString()); 148228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(0, mTextView.getSelectionStart()); 14835b51f77b99861d48fec1c327252416f726b3b01aJames Cook 148428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Undoing the redo restores the text again. 148528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 148628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals("xyz", mTextView.getText().toString()); 148728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(3, mTextView.getSelectionStart()); 148828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 148928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Undoing again undoes the original typing. 14905b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 14915b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 149228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals(0, mTextView.getSelectionStart()); 14935b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 14945b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 14955b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 149628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 14975b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1498c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Initialize the text view for simulated IME typing. Must be called on UI thread. 1499c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private InputConnection initTextViewForSimulatedIme() { 1500c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView = findTextView(R.id.textview_text); 1501c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 1502c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("", BufferType.EDITABLE); 1503c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook return mTextView.onCreateInputConnection(new EditorInfo()); 1504c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1505c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1506c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulates IME composing text behavior. 1507c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private void setComposingTextInBatch(InputConnection input, CharSequence text) { 1508c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1509c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText(text, 1); // Leave cursor at end. 1510c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1511c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1512c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1513c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1514c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertLatin() { 1515c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1516c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1517c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words, 1518c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // such as "c" -> "ca" -> "cat" -> "cat ". 1519c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "c"); 1520c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "ca"); 1521c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1522c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The completion and space are added in the same batch. 1523c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1524c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("cat", 1); 1525c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText(" ", 1); 1526c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1527c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1528c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements undo in a single step. 1529c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1530c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1531c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1532c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1533c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1534c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertJapanese() { 1535c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1536c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1537c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji. 1538c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1539c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String NA = "\u306A"; // HIRAGANA LETTER NA 1540c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1541c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1542c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1543c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + NA); 1544c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1545c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The result may be a surrogate pair. The composition ends in the same batch. 1546c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1547c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("\uD83C\uDF37", 1); // U+1F337 TULIP 1548c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText("", 1); 1549c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1550c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1551c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements are a single undo step. 1552c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1553c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1554c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1555c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1556c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1557c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeCancel() { 1558c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1559c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1560c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1561c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Start typing a composition. 1562c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1563c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1564c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1565c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1566c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1567c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Cancel the composition. 1568c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, ""); 1569c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1570c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1571c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1572c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1573c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1574c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1575c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1576c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1577c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1578c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeEmptyBatch() { 1579c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1580c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1581c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1582c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Send an empty batch edit. This happens if the IME is hidden and shown. 1583c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1584c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1585c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1586c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1587c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1588c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1589c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1590c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1591c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1592c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1593c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_setText() { 1594277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook initTextViewForTyping(); 159528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1596c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Create two undo operations, an insert and a delete. 15975bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "xyz"); 15985bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL, 15995bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir KeyEvent.KEYCODE_DEL); 1600277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mActivity.runOnUiThread(new Runnable() { 1601277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void run() { 1602c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Calling setText() clears both undo operations, so undo doesn't happen. 1603277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.setText("Hello", BufferType.EDITABLE); 1604277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1605277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("Hello", mTextView.getText().toString()); 160628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1607277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Clearing text programmatically does not undo either. 1608277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.setText("", BufferType.EDITABLE); 1609277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1610277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("", mTextView.getText().toString()); 1611277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1612277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1613277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1614277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 161528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1616c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testRedo_setText() { 1617277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook initTextViewForTyping(); 1618277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1619277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. This creates an undo entry. 16205bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 1621277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mActivity.runOnUiThread(new Runnable() { 1622277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void run() { 1623277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Undo the typing to create a redo entry. 1624277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1625277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1626277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Calling setText() clears the redo stack, so redo doesn't happen. 1627277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.setText("Hello", BufferType.EDITABLE); 1628277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1629277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("Hello", mTextView.getText().toString()); 1630277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1631277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1632277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1633277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1634277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1635c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_directAppend() { 1636277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook initTextViewForTyping(); 163728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1638277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 16395bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 1640277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mActivity.runOnUiThread(new Runnable() { 1641277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void run() { 1642277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Programmatically append some text. 1643277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.append("def"); 1644277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("abcdef", mTextView.getText().toString()); 1645277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1646277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Undo removes the append as a separate step. 1647277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1648277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("abc", mTextView.getText().toString()); 1649277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1650277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Another undo removes the original typing. 1651277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1652277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("", mTextView.getText().toString()); 1653277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1654277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1655277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1656277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1657277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1658c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_directInsert() { 1659277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook initTextViewForTyping(); 1660277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1661277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 16625bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 1663277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mActivity.runOnUiThread(new Runnable() { 1664277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void run() { 1665277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Directly modify the underlying Editable to insert some text. 1666277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // NOTE: This is a violation of the API of getText() which specifies that the 1667277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // returned object should not be modified. However, some apps do this anyway and 1668277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // the framework needs to handle it. 1669277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook Editable text = (Editable) mTextView.getText(); 1670277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook text.insert(0, "def"); 1671277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("defabc", mTextView.getText().toString()); 1672277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1673277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Undo removes the insert as a separate step. 1674277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1675277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("abc", mTextView.getText().toString()); 1676277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1677277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Another undo removes the original typing. 1678277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1679277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("", mTextView.getText().toString()); 1680277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1681277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1682277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1683277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1684277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1685c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void testUndo_noCursor() { 1686c530472a02205f0b7d87f9f06140c56ca0849816James Cook initTextViewForTyping(); 1687c530472a02205f0b7d87f9f06140c56ca0849816James Cook 1688c530472a02205f0b7d87f9f06140c56ca0849816James Cook mActivity.runOnUiThread(new Runnable() { 1689c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void run() { 1690c530472a02205f0b7d87f9f06140c56ca0849816James Cook // Append some text to create an undo operation. There is no cursor present. 1691c530472a02205f0b7d87f9f06140c56ca0849816James Cook mTextView.append("cat"); 1692c530472a02205f0b7d87f9f06140c56ca0849816James Cook 1693c530472a02205f0b7d87f9f06140c56ca0849816James Cook // Place the cursor at the end of the text so the undo will have to change it. 1694c530472a02205f0b7d87f9f06140c56ca0849816James Cook Selection.setSelection((Spannable) mTextView.getText(), 3); 1695c530472a02205f0b7d87f9f06140c56ca0849816James Cook 1696c530472a02205f0b7d87f9f06140c56ca0849816James Cook // Undo the append. This should not crash, despite not having a valid cursor 1697c530472a02205f0b7d87f9f06140c56ca0849816James Cook // position in the undo operation. 1698c530472a02205f0b7d87f9f06140c56ca0849816James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1699c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 1700c530472a02205f0b7d87f9f06140c56ca0849816James Cook }); 1701c530472a02205f0b7d87f9f06140c56ca0849816James Cook mInstrumentation.waitForIdleSync(); 1702c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 1703c530472a02205f0b7d87f9f06140c56ca0849816James Cook 1704c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_textWatcher() { 1705277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook initTextViewForTyping(); 1706277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1707277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Add a TextWatcher that converts the text to spaces on each change. 1708277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 1709277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1710277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 17115bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 1712277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mActivity.runOnUiThread(new Runnable() { 1713277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void run() { 1714277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // TextWatcher altered the text. 1715277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals(" ", mTextView.getText().toString()); 1716277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1717277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Undo reverses both changes in one step. 1718277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1719277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertEquals("", mTextView.getText().toString()); 1720277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1721277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1722277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1723c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 1724c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 1725c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void testUndo_textWatcherDirectAppend() { 1726c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook initTextViewForTyping(); 1727c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 1728c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Add a TextWatcher that converts the text to spaces on each change. 1729c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 1730c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 1731c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mActivity.runOnUiThread(new Runnable() { 1732c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void run() { 1733c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Programmatically append some text. The TextWatcher changes it to spaces. 1734c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.append("abc"); 1735c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook assertEquals(" ", mTextView.getText().toString()); 1736c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 1737c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Undo reverses both changes in one step. 1738c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1739c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook assertEquals("", mTextView.getText().toString()); 1740c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 1741c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook }); 1742c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mInstrumentation.waitForIdleSync(); 174328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 174428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1745c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_shortcuts() { 174628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook initTextViewForTyping(); 174728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 174828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Type some text. 17495bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 17505b51f77b99861d48fec1c327252416f726b3b01aJames Cook mActivity.runOnUiThread(new Runnable() { 17515b51f77b99861d48fec1c327252416f726b3b01aJames Cook public void run() { 17525b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Pressing Control-Z triggers undo. 17535b51f77b99861d48fec1c327252416f726b3b01aJames Cook KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0, 17545b51f77b99861d48fec1c327252416f726b3b01aJames Cook KeyEvent.META_CTRL_LEFT_ON); 1755277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control)); 17565b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 17575b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17585b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Pressing Control-Shift-Z triggers redo. 17595b51f77b99861d48fec1c327252416f726b3b01aJames Cook KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 17605b51f77b99861d48fec1c327252416f726b3b01aJames Cook 0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON); 1761277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift)); 176228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook assertEquals("abc", mTextView.getText().toString()); 17635b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 17645b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17655b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 17665b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 17675b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1768c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_saveInstanceState() { 176928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook initTextViewForTyping(); 17705b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17715b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text to create an undo operation. 17725bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "abc"); 17735b51f77b99861d48fec1c327252416f726b3b01aJames Cook mActivity.runOnUiThread(new Runnable() { 17745b51f77b99861d48fec1c327252416f726b3b01aJames Cook public void run() { 17755b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Parcel and unparcel the TextView. 17765b51f77b99861d48fec1c327252416f726b3b01aJames Cook Parcelable state = mTextView.onSaveInstanceState(); 17775b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onRestoreInstanceState(state); 17785b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 17795b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17805b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 17815b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17825b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Delete a character to create a new undo operation. 17835bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL); 17845b51f77b99861d48fec1c327252416f726b3b01aJames Cook mActivity.runOnUiThread(new Runnable() { 17855b51f77b99861d48fec1c327252416f726b3b01aJames Cook public void run() { 17865b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("ab", mTextView.getText().toString()); 17875b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17885b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Undo the delete. 17895b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 17905b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("abc", mTextView.getText().toString()); 17915b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17925b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Undo the typing, which verifies that the original undo operation was parceled 17935b51f77b99861d48fec1c327252416f726b3b01aJames Cook // correctly. 17945b51f77b99861d48fec1c327252416f726b3b01aJames Cook mTextView.onTextContextMenuItem(android.R.id.undo); 17955b51f77b99861d48fec1c327252416f726b3b01aJames Cook assertEquals("", mTextView.getText().toString()); 17965f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 17975f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Parcel and unparcel the undo stack (which is empty but has been used and may 17985f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // contain other state). 17995f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook Parcelable state = mTextView.onSaveInstanceState(); 18005f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onRestoreInstanceState(state); 18015f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 18025f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 18035f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 18045f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 18055f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 1806c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_saveInstanceStateEmpty() { 18075f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook initTextViewForTyping(); 18085f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 18095f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Type and delete to create two new undo operations. 18105bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "a"); 18115bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL); 18125f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mActivity.runOnUiThread(new Runnable() { 18135f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook public void run() { 18145f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Empty the undo stack then parcel and unparcel the TextView. While the undo 18155f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // stack contains no operations it may contain other state. 18165f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 18175f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 18185f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook Parcelable state = mTextView.onSaveInstanceState(); 18195f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onRestoreInstanceState(state); 18205f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 18215f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 18225f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 18235f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 18245f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Create two more undo operations. 18255bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendString(mTextView, "b"); 18265bd6955fa69a7f5e07d669ea677840099c4e1dbcSiyamed Sinir mKeyEventUtil.sendKeys(mTextView, KeyEvent.KEYCODE_DEL); 18275f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mActivity.runOnUiThread(new Runnable() { 18285f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook public void run() { 18295f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Verify undo still works. 18305f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 18315f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook assertEquals("b", mTextView.getText().toString()); 18325f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 18335f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook assertEquals("", mTextView.getText().toString()); 18345b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 18355b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 18365b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 18375b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 18385b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1839b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCopyAndPaste() { 1840b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 1841b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 1842b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void run() { 1843b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setText("abcd", BufferType.EDITABLE); 1844b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setSelected(true); 1845b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1846b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Copy "bc". 1847b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 1848b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.copy); 1849b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1850b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Paste "bc" between "b" and "c". 1851b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 1852b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 1853b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("abbccd", mTextView.getText().toString()); 1854b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1855b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Select entire text and paste "bc". 1856b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 1857b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 1858b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("bc", mTextView.getText().toString()); 1859b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 1860b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi }); 1861b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 1862b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 1863b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 186449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void testCopyAndPaste_byKey() { 186549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi initTextViewForTyping(); 186649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 186749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 186849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.sendStringSync("abc"); 186949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 187049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 187149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Select "bc" 187249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 187349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 187449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 187549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 187649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Copy "bc" 187749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi sendKeys(KeyEvent.KEYCODE_COPY); 187849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 187949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 188049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 188149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Set cursor between 'b' and 'c'. 188249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 188349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 188449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 188549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 188649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 188749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi sendKeys(KeyEvent.KEYCODE_PASTE); 188849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("abbcc", mTextView.getText().toString()); 188949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 189049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 189149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 189249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 189349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 189449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON); 189549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Shift + copy doesn't perform copy. 189649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 189749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 189849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 189949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bcabbcc", mTextView.getText().toString()); 190049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 190149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 190249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 190349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.META_CTRL_LEFT_ON); 190449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Control + copy doesn't perform copy. 190549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 190649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 190749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 190849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bcbcabbcc", mTextView.getText().toString()); 190949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 191049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 191149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 191249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 191349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Control + Shift + copy doesn't perform copy. 191449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 191549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 191649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 191749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bcbcbcabbcc", mTextView.getText().toString()); 191849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 191949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 19208e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 192149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 192249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 1923b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste() { 1924b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 1925b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 1926b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void run() { 1927b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setText("abcd", BufferType.EDITABLE); 1928b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setSelected(true); 1929b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1930b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Cut "bc". 1931b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 1932b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.cut); 1933b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("ad", mTextView.getText().toString()); 1934b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1935b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Cut "ad". 1936b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 0, 2); 1937b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.cut); 1938b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 1939b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 1940b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Paste "ad". 1941b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 1942b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("ad", mTextView.getText().toString()); 1943b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 1944b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi }); 1945b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 1946b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 1947b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 194849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void testCutAndPaste_byKey() { 194949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi initTextViewForTyping(); 195049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 195149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 195249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.sendStringSync("abc"); 195349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 195449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 195549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Select "bc" 195649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 195749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 195849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 195949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 196049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Cut "bc" 196149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi sendKeys(KeyEvent.KEYCODE_CUT); 196249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 196349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 196449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 196549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("a", mTextView.getText().toString()); 196649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Move cursor to the head 196749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 196849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 196949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 197049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 197149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 197249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi sendKeys(KeyEvent.KEYCODE_PASTE); 197349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 197449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 197549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 197649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi public void run() { 197749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 197849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 197949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON); 198049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Shift + cut doesn't perform cut. 198149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 198249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 198349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 198449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 198549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.META_CTRL_LEFT_ON); 198649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Control + cut doesn't perform cut. 198749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 198849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 198949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 199049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 199149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 199249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Control + Shift + cut doesn't perform cut. 199349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 199449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 199549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 199649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 199749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 199849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 1999b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) { 2000b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable)textView.getText(); 2001b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final int at = spannable.length() / 2; 2002b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi return spannable.getSpans(at, at, type).length > 0; 2003b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2004b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2005b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste_withAndWithoutStyle() { 2006b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 2007b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 2008b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void run() { 2009b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setText("example", BufferType.EDITABLE); 2010b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.setSelected(true); 2011b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2012b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Set URLSpan. 2013b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable) mTextView.getText(); 2014b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0); 2015b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2016b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2017b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Cut entire text. 2018b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 2019b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.cut); 2020b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 2021b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2022b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Paste without style. 2023b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText); 2024b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("example", mTextView.getText().toString()); 2025b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Check that the text doesn't have URLSpan. 2026b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2027b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2028b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Paste with style. 2029b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi Selection.selectAll((Spannable) mTextView.getText()); 2030b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.paste); 2031b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertEquals("example", mTextView.getText().toString()); 2032b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi // Check that the text has URLSpan. 2033b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2034b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2035b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi }); 2036b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 2037b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2038b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 20404ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien public void testSaveInstanceState() { 2041baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // should save text when freezesText=true 20424ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView originalTextView = new TextView(mActivity); 20434ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 20444ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setText(text); 20454ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setFreezesText(true); // needed to actually save state 20464ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien Parcelable state = originalTextView.onSaveInstanceState(); 20474ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 20484ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView restoredTextView = new TextView(mActivity); 20494ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien restoredTextView.onRestoreInstanceState(state); 20504ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien assertEquals(text, restoredTextView.getText().toString()); 20514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 20524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 20534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2054baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_whenFreezesTextIsFalse() { 20554ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 2056baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text when freezesText=false 2057baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2058baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2059baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2060baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 20614ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 2062baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2063baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2064baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2065baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2066baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2067baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2068baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2069baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2070baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2071baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text even when textIsSelectable=true 2072baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2073baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2074baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2075baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2076baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2077baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2078baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2079baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2080baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2081baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2082baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2083baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2084baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2085baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2086baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2087baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2088baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2089baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2090baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2091baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() { 2092baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2093baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2094baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2095baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2096baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2097baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2098baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2099baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2100baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2101baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2102baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2103baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2104baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionStart()); 2105baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionEnd()); 2106baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2107baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2108baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2109baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2110baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() { 2111baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2112baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2113baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2114baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2115baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2116baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2117baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2118baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2119baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2120baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2121baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2122baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2123baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2124baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2125baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2126baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2127baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir //when textIsSelectable, selection start and end are initialized to 0 2128baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionStart()); 2129baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionEnd()); 2130baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2131baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2132baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2133baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2134baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_savesSelectionWhenExists() { 2135baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2136baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2137baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2138baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2139baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2140baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2141baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2142baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2143baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2144baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2145baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2146baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2147baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2148baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2149baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2150baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart()); 2151baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd()); 21524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 21534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 21544ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText() { 2156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 2157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 2159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 2160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.EDITABLE); 2162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 2164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.SPANNABLE); 2166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 2168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1, BufferType.EDITABLE); 2171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 2172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHint() { 2178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 2179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 2181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHint()); 2182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_blank); 2184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getHint()); 2185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_string); 2187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint), 2188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_resid); 2191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hint), 2192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint("This is hint"); 2195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("This is hint", mTextView.getHint().toString()); 2196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(R.string.text_view_hello); 2198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 2199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint().toString()); 2200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Non-exist resid 2202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(-1); 2204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if id is illegal"); 2205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessError() { 2210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 221353b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner final String errorText = "Oops! There is an error"; 2214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setError(null); 2218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 22239776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio final Drawable icon = getDrawable(R.drawable.failed); 2224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setError(errorText, icon); 2227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // can not check whether the drawable is set correctly 2232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setError(null, null); 2236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2243300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mTextView.setKeyListener(DigitsKeyListener.getInstance("")); 2244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("", BufferType.EDITABLE); 2245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setError(errorText); 2246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 2247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2253dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("a"); 2254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event that will not change the TextView's text 2255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getText().toString()); 2256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // The icon and error message will not be reset to null 225753b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner assertEquals(errorText, mTextView.getError().toString()); 2258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2259300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mActivity.runOnUiThread(new Runnable() { 2260300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu public void run() { 2261300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mTextView.setKeyListener(DigitsKeyListener.getInstance()); 2262300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mTextView.setText("", BufferType.EDITABLE); 2263300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mTextView.setError(errorText); 2264300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mTextView.requestFocus(); 2265300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu } 2266300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu }); 2267300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mInstrumentation.waitForIdleSync(); 2268300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu 2269dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("1"); 2270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event cause changes to the TextView's text 2271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("1", mTextView.getText().toString()); 2272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the error message and icon will be cleared. 2273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFilters() { 2277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final InputFilter[] expected = { new InputFilter.AllCaps(), 2278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new InputFilter.LengthFilter(2) }; 2279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 2281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 2282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(qwertyKeyListener); 2286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("", BufferType.EDITABLE); 2287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(expected); 2288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 2289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(expected, mTextView.getFilters()); 2294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2295dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("a"); 2296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("A", mTextView.getText().toString()); 2298dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("b"); 2299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2301dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("c"); 2302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 'C' could not be accepted, because there is a length filter. 2303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(null); 2307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw IllegalArgumentException!"); 2308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IllegalArgumentException e) { 2309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetFocusedRect() { 2313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2315fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Basic 2316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2323fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Single line 2324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelected(true); 2334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString text = new SpannableString(mTextView.getText()); 2335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection(text, 3, 13); 2336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 2337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 2342fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien /* Cursor coordinates from getPrimaryHorizontal() may have a fractional 2343fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * component, while the result of getFocusedRect is in int coordinates. 2344fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * It's not practical for these to match exactly, so we compare that the 2345fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * integer components match - there can be a fractional pixel 2346fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * discrepancy, which should be okay for all practical applications. */ 2347fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left); 2348fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right); 2349fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2350fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2351fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2352fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mActivity.runOnUiThread(new Runnable() { 2353fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio public void run() { 2354fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setSelected(true); 2355fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio SpannableString text = new SpannableString(mTextView.getText()); 2356fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Selection.setSelection(text, 13, 3); 2357fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setText(text); 2358fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio } 2359fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2360fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2361fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2362fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2363fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left); 2364fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right); 2365fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2366fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2367fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2368fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Multi lines 2369fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView = findTextView(R.id.textview_text_two_lines); 2370fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2371fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX(), rc.left); 2372fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2373fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY(), rc.top); 2374fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2375fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2376fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mActivity.runOnUiThread(new Runnable() { 2377fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio public void run() { 2378fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setSelected(true); 2379fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio SpannableString text = new SpannableString(mTextView.getText()); 2380fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Selection.setSelection(text, 2, 4); 2381fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setText(text); 2382fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio } 2383fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2384fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2385fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2386fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2387fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left); 2388fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right); 2389fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2390fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2391fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2392fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mActivity.runOnUiThread(new Runnable() { 2393fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio public void run() { 2394fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setSelected(true); 2395fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio SpannableString text = new SpannableString(mTextView.getText()); 2396fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Selection.setSelection(text, 2, 10); // cross the "\n" and two lines 2397fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.setText(text); 2398fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio } 2399fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2400fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2401fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2402fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Path path = new Path(); 2403fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getLayout().getSelectionPath(2, 10, path); 2404fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio RectF rcf = new RectF(); 2405fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio path.computeBounds(rcf, true); 2406fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2407fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(rcf.left - 1, (float) rc.left); 2408fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(rcf.right + 1, (float) rc.right); 2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2410fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom); 2411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Exception 2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(null); 2415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineCount() { 2421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // this is an one line text with default setting. 2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multi-lines 2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(mTextView.getWidth() / 3); 2427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it to an one line 2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(Integer.MAX_VALUE); 2431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set min lines don't effect the lines count for actual text. 2434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(12); 2435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the internal Layout has not been built. 2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLayout()); 2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineCount()); 2441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineBounds() { 2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, null)); 2447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, rc)); 2449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.right); 2451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.bottom); 2453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null)); 2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth(), rc.right); 2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight(), rc.bottom); 2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(1, 2, 3, 4); 2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingLeft(), rc.left); 2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right); 2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingTop(), rc.top); 2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom); 2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetBaseLine() { 2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getBaseline()); 2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline()); 2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(1, 2, 3, 4); 2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0); 2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getBaseline()); 2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPressKey() { 249628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook initTextViewForTyping(); 2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2498dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("a"); 2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2500dc4fcb2f0b734c9e5ca03a97429bf3bd9b189abaBrian Muramatsu mInstrumentation.sendStringSync("b"); 2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("ab", mTextView.getText().toString()); 2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su sendKeys(KeyEvent.KEYCODE_DEL); 2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetIncludeFontPadding() { 2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2508ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getIncludeFontPadding()); 2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() / 3); 2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(1, 2, 3, 4); 2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int oldHeight = mTextView.getHeight(); 2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setIncludeFontPadding(false); 2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() < oldHeight); 2527ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getIncludeFontPadding()); 2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testScroll() { 2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //don't set the Scroller, nothing changed. 2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the Scroller 2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Scroller s = new Scroller(mActivity); 2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(s); 2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.startScroll(0, 0, 320, 480, 0); 2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.abortAnimation(); 2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.forceFinished(false); 2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setScroller(s); 2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, mTextView.getScrollX()); 2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, mTextView.getScrollY()); 2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testDebug() { 2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(0); 2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello!"); 2559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(mTextView); 2560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(1); 2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSelection() { 2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "This is the content"; 2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.selectAll((Spannable) mTextView.getText()); 2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.length(), mTextView.getSelectionEnd()); 2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionStart = 5; 2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionEnd = 7; 2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart); 2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionEnd()); 2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); 2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, mTextView.getSelectionEnd()); 2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessEllipsize() { 2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_ellipsize); 2590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_default); 2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_none); 2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_start); 2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.START, mTextView.getEllipsize()); 2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_middle); 2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize()); 2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_end); 2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.END, mTextView.getEllipsize()); 2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); 2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize()); 2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.END); 2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize()); 2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(null); 2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(10); 2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord"); 2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.invalidate(); 2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no method to check if '...yLongVeryLongWord' is painted in the screen. 2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26272deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForSingleLine() { 26282deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir int textWidth = calculateTextWidth(LONG_TEXT); 26292deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26302deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir TextView tvEllipsizeEnd = new TextView(getActivity()); 26312deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 26322deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setMaxLines(1); 26332deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setWidth(textWidth >> 2); 26342deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setText(LONG_TEXT); 26352deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26362deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir TextView tvEllipsizeNone = new TextView(getActivity()); 26372deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.setWidth(textWidth >> 2); 26382deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.setText("a"); 26392deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26402deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 26412deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 26422deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 26432deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 26442deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 26452deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 26462deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.setLayoutParams(layoutParams); 26472deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26482deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir mActivity.runOnUiThread(new Runnable() { 26492deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir @Override 26502deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir public void run() { 26512deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir getActivity().setContentView(layout); 26522deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 26532deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir }); 26542deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir getInstrumentation().waitForIdleSync(); 26552deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26562deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir assertEquals("Ellipsized and non ellipsized single line texts should have the same " + 26572deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir "baseline", 26582deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(0), 26592deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(0)); 26602deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 26612deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26622deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir public void testEllipsizeEndAndNoEllipsizeHasSameBaselineForMultiLine() { 26632deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir int textWidth = calculateTextWidth(LONG_TEXT); 26642deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26652deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir TextView tvEllipsizeEnd = new TextView(getActivity()); 26662deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 26672deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setMaxLines(2); 26682deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setWidth(textWidth >> 2); 26692deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.setText(LONG_TEXT); 26702deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26712deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir TextView tvEllipsizeNone = new TextView(getActivity()); 26722deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.setMaxLines(2); 26732deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.setWidth(textWidth >> 2); 26742deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.setText(LONG_TEXT); 26752deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26762deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 26772deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 26782deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 26792deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 26802deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26812deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 26822deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 26832deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir layout.setLayoutParams(layoutParams); 26842deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26852deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir mActivity.runOnUiThread(new Runnable() { 26862deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir @Override 26872deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir public void run() { 26882deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir getActivity().setContentView(layout); 26892deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 26902deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir }); 26912deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir getInstrumentation().waitForIdleSync(); 26922deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 26932deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) { 26942deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir assertEquals("Ellipsized and non ellipsized multi line texts should have the same " + 26952deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir "baseline for line " + i, 26962deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 26972deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(i)); 26982deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 26992deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 27002deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 2701672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir public void testTextViewInWeigthenedLayoutChangesWidthAfterSetText() { 2702672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir final TextView textView = new TextView(getActivity()); 2703672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir textView.setEllipsize(TruncateAt.END); 2704672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir textView.setSingleLine(true); 2705672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir textView.setText("a"); 2706672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2707672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir TextView otherTextView = new TextView(getActivity()); 2708672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir otherTextView.setSingleLine(true); 2709672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir otherTextView.setText("any"); 2710672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2711672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir final LinearLayout layout = new LinearLayout(mActivity); 2712672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir layout.setOrientation(LinearLayout.HORIZONTAL); 2713672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2714672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir // TextView under test has weight 1, and width 0 2715672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir layout.addView(textView, new LinearLayout.LayoutParams(0, 2716672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f)); 2717672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2718672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir // other TextView has default weight 2719672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir layout.addView(otherTextView, new LinearLayout.LayoutParams( 2720672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 2721672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT)); 2722672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2723672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir // main layout params 2724672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir layout.setLayoutParams(new ViewGroup.LayoutParams( 2725672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 2726672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2727672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir mActivity.runOnUiThread(new Runnable() { 2728672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir @Override 2729672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir public void run() { 2730672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir getActivity().setContentView(layout); 2731672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir } 2732672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir }); 2733672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir getInstrumentation().waitForIdleSync(); 2734672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2735672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir int oldWidth = textView.getWidth(); 2736672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2737672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir mActivity.runOnUiThread(new Runnable() { 2738672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir @Override 2739672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir public void run() { 2740672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir textView.setText("aaa"); 2741672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir } 2742672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir }); 2743672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir getInstrumentation().waitForIdleSync(); 2744672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2745672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir assertTrue("TextView should have larger width after a longer text is set", 2746672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir textView.getWidth() > oldWidth); 2747672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir } 2748672de87741b35d488adeabd3a4b9f8440dbc8beeSiyamed Sinir 2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetCursorVisible() { 2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(true); 2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(false); 2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnWindowFocusChanged() { 2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnTouchEvent() { 2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnTrackballEvent() { 2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTextColors() { 2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // TODO: How to get a suitable TypedArray to test this method. 2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnKeyShortcut() { 2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPerformLongClick() { 2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("This is content"); 2780938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 2781938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnLongClickListener mockOnLongClickListener = mock(View.OnLongClickListener.class); 2782938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.TRUE); 2783938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 2784938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnCreateContextMenuListener mockOnCreateContextMenuListener = 2785938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mock(View.OnCreateContextMenuListener.class); 2786938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doAnswer(new Answer() { 2787938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public Object answer(InvocationOnMock invocation) { 2788938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((ContextMenu) invocation.getArguments() [0]).add("menu item"); 2789938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov return null; 2790938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 2791938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov }).when(mockOnCreateContextMenuListener).onCreateContextMenu( 2792938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class)); 2793938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 2794938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnLongClickListener(mockOnLongClickListener); 2795938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener); 2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 2797938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 2798938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyZeroInteractions(mockOnCreateContextMenuListener); 2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2800938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnLongClickListener); 2801938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.FALSE); 2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 2803938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 2804938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 2805938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class)); 2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2807938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnCreateContextMenuListener); 2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setOnLongClickListener(null); 2809938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu( 2810938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class)); 2811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.performLongClick()); 2812938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyNoMoreInteractions(mockOnLongClickListener); 2813938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 2814938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class)); 2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextAttr() { 2819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_textAttr); 2820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getText 2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString()); 2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getCurrentTextColor 2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 2827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 2828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 2829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHintTextColors().getDefaultColor()); 2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 2831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextScaleX 2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f); 2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextScaleX 2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(2.4f); 2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f); 2839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(0f); 2841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0f, mTextView.getTextScaleX(), 0.01f); 2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(- 2.4f); 2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f); 2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextSize 2847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTypeface 2850119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson // getTypeface will be null if android:typeface is set to normal, 2851c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // and android:style is not set or is set to normal, and 2852c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // android:fontFamily is not set 2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT); 2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.DEFAULT, mTextView.getTypeface()); 2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face 2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null); 2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // default type face, bold style, note: the type face will be changed 2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // after call set method 2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); 2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 2865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face, BOLD style 2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null, Typeface.BOLD); 2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // old type face, null style 2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, 0); 2872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 2873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAppend() { 2877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1: check the original length, should be blank as initialised. 2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getText().length()); 2881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 2: append a string use append(CharSquence) into the original blank 2883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was 2884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // not already editable. 2885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getText() instanceof Editable); 2886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append."); 2887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.", mTextView.getText().toString()); 2888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 2889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 3: append a string from 0~3. 2891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 3); 2892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 2893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 2894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 4: append a string from 0~0, nothing will be append as expected. 2896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 0); 2897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 2898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 2899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 5: append a string from -3~3. check the wrong left edge. 2901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", -3, 3); 2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 2904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 2905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 6: append a string from 3~10. check the wrong right edge. 2908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 3, 10); 2910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 2911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 2912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 7: append a null string. 2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(null); 2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException"); 2918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2922f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2923f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() { 2924f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 2925f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 2926f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 2927f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2928f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" another text without URL"); 2929f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2930f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 2931f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 2932f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 2933f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL another text without URL", text.toString()); 2934f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 2935f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2936f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2937f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() { 2938f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 2939f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 2940f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2941f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 2942f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2943f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 2944f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 2945f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 2946f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 2947f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 2948f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2949f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2950f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenAutoLinkIsEnabled() { 2951f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 2952f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 2953f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 2954f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2955f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 2956f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2957f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 2958f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 2959f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 2960f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 2961f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 2962f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 2963f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 2964f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2965f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2966f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() { 2967f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 2968f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 2969f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with URL http://android.com/before"); 2970f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2971f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 2972f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2973f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 2974f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 2975f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length); 2976f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("First URLSpan URL should be same", 2977f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/before"); 2978f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 2979f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[1].getURL(), "http://android.com"); 2980f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text with URL http://android.com/before text with URL http://android.com", 2981f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir text.toString()); 2982f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 2983f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2984f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2985f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() { 2986f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 2987f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 2988f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 2989f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2990f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with a url: http://android.com"); 2991f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2992f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertNotNull("MovementMethod should not be null when text contains url", 2993f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod()); 2994f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url", 2995f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod() instanceof LinkMovementMethod); 2996f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 2997f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 2998f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 2999f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() { 3000f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3001f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3002f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3003f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3004f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(new SpannableString(" text with a url: http://android.com")); 3005f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3006f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3007f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3008f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3009f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3010f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3011f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3012f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3013f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3014f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() { 3015f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3016f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3017f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a partial url android."); 3018f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3019f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("com"); 3020f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3021f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3022f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3023f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending to partial URL", 3024f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 1, urlSpans.length); 3025f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3026f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3027f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3028f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3029f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3030f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() { 3031f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3032f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3033f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a url http://android.com"); 3034f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3035f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("/textview"); 3036f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3037f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3038f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3039f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length); 3040f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the new URL", 3041f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/textview"); 3042f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3043f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3044f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTransformationMethod() { 3046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the password attribute in xml 3047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_password); 3048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the singleLine attribute in xml 3053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_singleLine); 3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(SingleLineTransformationMethod.getInstance(), 3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false, 3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Capitalize.NONE); 3060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final TransformationMethod method = PasswordTransformationMethod.getInstance(); 3061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change transformation method by function 3062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(qwertyKeyListener); 3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTransformationMethod(method); 306622d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root mTransformedText = method.getTransformation(mTextView.getText(), mTextView); 3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su sendKeys("H E 2*L O"); 3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(" "); 3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it will get transformed after a while 30840162547f44173f0604d8a80143c128d9892460a1Kristian Monsen new PollingCheck(TIMEOUT) { 3085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @Override 3086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su protected boolean check() { 3087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // "******" 308822d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root return mTransformedText.toString() 308922d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root .equals("\u2022\u2022\u2022\u2022\u2022\u2022"); 3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }.run(); 3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set null 3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTransformationMethod(null); 3097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTransformationMethod()); 3101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testCompound() { 3105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int padding = 3; 3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Drawable[] drawables = mTextView.getCompoundDrawables(); 3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[0]); 3109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[1]); 3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[2]); 3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test setCompoundDrawablePadding and getCompoundDrawablePadding 3114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablePadding(padding); 3115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(padding, mTextView.getCompoundDrawablePadding()); 3116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using resid, 0 represents null 3118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass, 3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su R.drawable.failed, 0); 3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su WidgetTestUtils.assertEquals(getBitmap(R.drawable.start), 3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[0]).getBitmap()); 3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su WidgetTestUtils.assertEquals(getBitmap(R.drawable.pass), 3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[1]).getBitmap()); 3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su WidgetTestUtils.assertEquals(getBitmap(R.drawable.failed), 3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[2]).getBitmap()); 3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 31349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable left = getDrawable(R.drawable.blue); 31359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable right = getDrawable(R.drawable.yellow); 31369776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable top = getDrawable(R.drawable.red); 3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using drawables directly 3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null); 3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(), 3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(), 3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(), 3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set bounds to drawables and set them again. 3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 1, 2); 3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 3, 4); 3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 5, 6); 3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // usinf drawables 3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, top, right, null); 3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(), 3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(), 3181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(), 3183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSingleLine() { 3188013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final TextView textView = new TextView(mActivity); 3189013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu setSpannableText(textView, "This is a really long sentence" 3190013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu + " which can not be placed in one line on the screen."); 3191013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3192013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu // Narrow layout assures that the text will get wrapped. 3193013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu FrameLayout innerLayout = new FrameLayout(mActivity); 3194013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 3195013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.addView(textView); 3196013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3197013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 3198013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu layout.addView(innerLayout); 3199013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3200013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mActivity.runOnUiThread(new Runnable() { 3201013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu public void run() { 3202013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mActivity.setContentView(layout); 3203013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu textView.setSingleLine(true); 3204013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu } 3205013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu }); 3206013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mInstrumentation.waitForIdleSync(); 3207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 3209013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu textView.getTransformationMethod()); 3210da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3211da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineWidth = 0; 3212da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineHeight = 0; 3213da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3214da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu if (textView.getLayout() != null) { 3215da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu singleLineWidth = textView.getLayout().getWidth(); 3216da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu singleLineHeight = textView.getLayout().getHeight(); 3217da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3221013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu textView.setSingleLine(false); 3222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3225013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu assertEquals(null, textView.getTransformationMethod()); 3226da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3227da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu if (textView.getLayout() != null) { 3228da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu assertTrue(textView.getLayout().getHeight() > singleLineHeight); 3229da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu assertTrue(textView.getLayout().getWidth() < singleLineWidth); 3230da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // same behaviours as setSingLine(true) 3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3235013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu textView.setSingleLine(); 3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 3240013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu textView.getTransformationMethod()); 3241da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3242da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu if (textView.getLayout() != null) { 3243da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu assertEquals(singleLineHeight, textView.getLayout().getHeight()); 3244da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu assertEquals(singleLineWidth, textView.getLayout().getWidth()); 3245da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 324998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMaxLines() { 3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float[] widths = new float[LONG_TEXT.length()]; 3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaint().getTextWidths(LONG_TEXT, widths); 3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float totalWidth = 0.0f; 3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su for (float f : widths) { 3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su totalWidth += f; 3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int stringWidth = (int) totalWidth; 3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(stringWidth >> 2); 3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT); 3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int maxLines = 2; 3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > maxLines); 3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxLines(maxLines); 3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestLayout(); 3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 326898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2, mTextView.getMaxLines()); 326998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight()); 3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3273636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public int calculateTextWidth(String text) { 3274636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 3275636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3276636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Set the TextView width as the half of the whole text. 3277636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka float[] widths = new float[text.length()]; 3278636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.getPaint().getTextWidths(text, widths); 3279636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka float textfieldWidth = 0.0f; 3280636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int i = 0; i < text.length(); ++i) { 3281636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka textfieldWidth += widths[i]; 3282636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3283636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka return (int)textfieldWidth; 3284636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3285636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3286636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3287636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 3288636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_frequencyNone() { 3289636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] BREAK_STRATEGIES = { 3290636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY, 3291636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_BALANCED }; 3292636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3293636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 3294636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3295636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int breakStrategy : BREAK_STRATEGIES) { 3296636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 3297636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 3298636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth))); 3299636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3300636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 3301636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(breakStrategy); 3302636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3303636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 3304636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3305636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 3306636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 3307636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 3308636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3309636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 3310636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 3311636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 3312636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any break strategy, hyphenation should not happen if 3313636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // HYPHENATION_FREQUENCY_NONE is specified. 3314636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 3315636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 3316636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3317636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3318636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3319636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3320636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3321636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 3322636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_breakStrategySimple() { 3323636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] HYPHENATION_FREQUENCIES = { 3324636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, 3325636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NONE }; 3326636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3327636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 3328636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3329636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) { 3330636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 3331636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 3332636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setWidth(calculateTextWidth(LONG_TEXT.substring(0, charWidth))); 3333636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3334636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 3335636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 3336636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3337636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(hyphenationFrequency); 3338636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3339636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 3340636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 3341636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 3342636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3343636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 3344636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 3345636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 3346636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any hyphenation frequency, hyphenation should not happen if 3347636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // BREAK_STRATEGY_SIMPLE is specified. 3348636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 3349636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 3350636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3351636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3352636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3353636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3354636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxLinesException() { 335772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 335872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 3359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() >> 3); 336072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setMaxLines(-1); 3361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 336398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMinLines() { 3364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 3366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 3367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines - 1); 3369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 337098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines - 1, mTextView.getMinLines()); 337198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 3372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines + 1); 3374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 337598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines + 1, mTextView.getMinLines()); 337698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 3377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLines() { 3380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multiple lines 3382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 3383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 3384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines - 1); 3386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 3387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines + 1); 3389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 3390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLinesException() { 339472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 339572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 339672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setWidth(mTextView.getWidth() >> 3); 339772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setLines(-1); 3398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingTop() { 3402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingTop()); 3405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 34079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio final Drawable top = getDrawable(R.drawable.red); 3408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 3409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 3410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop()); 3411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 3413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 3414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 3415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingTop() > 0); 3417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingBottom() { 3421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingBottom()); 3424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 34269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio final Drawable bottom = getDrawable(R.drawable.red); 3427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 3428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 3429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom()); 3430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 3432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 3433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 3434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingBottom() > 0); 3436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingTop() { 3439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingTop()); 3442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 34449776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio final Drawable top = getDrawable(R.drawable.red); 3445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 3446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 3449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 3450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 3451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop()); 3455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 3457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 3458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getHeight() 3459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 3460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineTop(mTextView.getLineCount()); 3461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingTop()); 3462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingBottom() { 3465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingBottom()); 3468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 34709776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio final Drawable bottom = getDrawable(R.drawable.red); 3471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 3472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 3475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 3476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 3477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom()); 3481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 3483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 3484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = ((mTextView.getHeight() 3485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 3486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingTop() 3487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1) 3488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + mTextView.getExtendedPaddingBottom(); 3489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingBottom()); 3490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingLeft() { 3494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingLeft()); 3497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 34999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable left = getDrawable(R.drawable.red); 3500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 10, 100); 3501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, null, null, null); 3502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 3503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 3504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 3506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 3507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 3508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingRight() { 3512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 3514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingRight()); 3515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 35179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable right = getDrawable(R.drawable.red); 3518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 10, 100); 3519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, right, null); 3520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_HORIZONTAL); 3521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 3522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 3524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 3525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 3526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetUrls() { 3529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = mTextView.getUrls(); 3532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, spans.length); 3533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String url = "http://www.google.com"; 3535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String email = "name@gmail.com"; 3536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = url + " mailto:" + email; 3537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString spannable = new SpannableString(string); 3538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(url), 0, url.length(), 0); 3539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 3540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 3541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 3542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 3543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(email), 0, email.length(), 0); 3545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 3546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 3548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 3549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 3550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(email, spans[1].getURL()); 3551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test the situation that param what is not a URLSpan 3553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new Object(), 0, 9, 0); 3554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 3555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 3556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 3557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetPadding() { 3560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(0, 1, 2, 4); 3563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getPaddingLeft()); 3564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getPaddingTop()); 3565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getPaddingRight()); 3566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getPaddingBottom()); 3567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(10, 20, 30, 40); 3569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(10, mTextView.getPaddingLeft()); 3570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20, mTextView.getPaddingTop()); 3571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(30, mTextView.getPaddingRight()); 3572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(40, mTextView.getPaddingBottom()); 3573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3575fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testDeprecatedSetTextAppearance() { 3576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All); 3579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 3582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors); 3589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 3594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors); 3597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(17f, mTextView.getTextSize(), 0.01f); 3598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style); 3601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(null, mTextView.getTypeface()); 3602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3604fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testSetTextAppearance() { 3605fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 3606fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3607fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_All); 3608fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 3609fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 3610fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(20f, mTextView.getTextSize(), 0.01f); 3611fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3612fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.red), 3613fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 3614fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3615fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 3616fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3617fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Colors); 3618fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 3619fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 3620fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3621fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 3622fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 3623fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 3624fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3625fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_NotColors); 3626fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(17f, mTextView.getTextSize(), 0.01f); 3627fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3628fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3629fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Style); 3630fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(null, mTextView.getTypeface()); 3631fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 3632fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnPreDraw() { 3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3637fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testAccessCompoundDrawableTint() { 3638fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 3639fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3640fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai ColorStateList colors = ColorStateList.valueOf(Color.RED); 3641fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintList(colors); 3642fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR); 3643fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertSame(colors, mTextView.getCompoundDrawableTintList()); 3644fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 3645f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 3646f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette // Ensure the tint is preserved across drawable changes. 3647f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawablesRelative(null, null, null, null); 3648f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 3649f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 3650f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 3651f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(null, null, null, null); 3652f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 3653f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 3654f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 3655f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr1 = new ColorDrawable(Color.RED); 3656f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr2 = new ColorDrawable(Color.GREEN); 3657f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr3 = new ColorDrawable(Color.BLUE); 3658f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr4 = new ColorDrawable(Color.YELLOW); 3659f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4); 3660f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 3661f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 3662fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 3663fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 3664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetHorizontallyScrolling() { 3665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the text view has more than one line 3666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 1); 3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 3669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(true); 3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(false); 3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 3675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testComputeHorizontalScrollRange() { 3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getLayout()); 3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange()); 3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setFrame(0, 0, 40, 50); 3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(textView.getWidth(), textView.computeHorizontalScrollRange()); 3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set the layout 3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(textView); 3688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(textView.getLayout().getWidth(), textView.computeHorizontalScrollRange()); 3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testComputeVerticalScrollRange() { 3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getLayout()); 3695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.computeVerticalScrollRange()); 3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setFrame(0, 0, 40, 50); 3698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(textView.getHeight(), textView.computeVerticalScrollRange()); 3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the layout 3701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(textView); 3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(textView.getLayout().getHeight(), textView.computeVerticalScrollRange()); 3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testDrawableStateChanged() { 3706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.reset(); 3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.refreshDrawableState(); 3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.hasCalledDrawableStateChanged()); 3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultEditable() { 3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultEditable() does nothing, and always return false. 3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.getDefaultEditable()); 3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultMovementMethod() { 3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultMovementMethod() does nothing, and always return null. 3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getDefaultMovementMethod()); 3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnCreateContextMenu() { 3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnDetachedFromWindow() { 3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnDraw() { 3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnFocusChanged() { 3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnMeasure() { 3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnTextChanged() { 3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetFrame() { 3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a new size to this view 3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(0, 0, 320, 480)); 3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getFrameLeft()); 3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, textView.getFrameTop()); 3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, textView.getFrameRight()); 3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, textView.getFrameBottom()); 3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a same size to this view 3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.setFrame(0, 0, 320, 480)); 3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //negative input 3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(-1, -1, -1, -1)); 3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getFrameLeft()); 3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getFrameTop()); 3768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getFrameRight()); 3769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, textView.getFrameBottom()); 3770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testMarquee() { 3773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MockTextView textView = new MockTextView(mActivity); 3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setText(LONG_TEXT); 3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setSingleLine(); 3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setEllipsize(TruncateAt.MARQUEE); 3777bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu textView.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 3778bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 3779bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 3780bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu layout.addView(textView); 3781bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the fading to be shown 3783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setHorizontalFadingEdgeEnabled(true); 3784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3787bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu mActivity.setContentView(layout); 3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestSelectedRunnable runnable = new TestSelectedRunnable(textView) { 3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setMarqueeRepeatLimit(-1); 3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to start 3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setSelected(true); 3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(runnable); 3802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // wait for the marquee to run 3804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // fading is shown on both sides if the marquee runs for a while 38050162547f44173f0604d8a80143c128d9892460a1Kristian Monsen new PollingCheck(TIMEOUT) { 3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @Override 3807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su protected boolean check() { 3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return textView.getLeftFadingEdgeStrength() > 0.0f 3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su && textView.getRightFadingEdgeStrength() > 0.0f; 3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }.run(); 3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 38130f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir // wait for left marquee to fully apply 38140162547f44173f0604d8a80143c128d9892460a1Kristian Monsen new PollingCheck(TIMEOUT) { 3815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @Override 3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su protected boolean check() { 38170f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir return textView.getLeftFadingEdgeStrength() > 0.99f; 3818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }.run(); 3820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected1()); 3821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected2()); 3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su runnable = new TestSelectedRunnable(textView) { 3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setMarqueeRepeatLimit(0); 3826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setSelected(false); 3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setGravity(Gravity.LEFT); 3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(runnable); 3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected1()); 3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected2()); 3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f); 3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getRightFadingEdgeStrength() > 0.0f); 3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setGravity(Gravity.RIGHT); 3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getLeftFadingEdgeStrength() > 0.0f); 3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0.0f, textView.getRightFadingEdgeStrength(), 0.01f); 3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setGravity(Gravity.CENTER_HORIZONTAL); 3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no left fading (Is it correct?) 3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0.0f, textView.getLeftFadingEdgeStrength(), 0.01f); 3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getRightFadingEdgeStrength() > 0.0f); 3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnKeyMultiple() { 3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessInputExtras() throws XmlPullParserException, IOException { 3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView textView = new TextView(mActivity); 3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setText(null, BufferType.EDITABLE); 3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_TEXT); 3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // do not create the extras 3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getInputExtras(false)); 3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // create if it does not exist 3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Bundle inputExtras = textView.getInputExtras(true); 3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(inputExtras); 3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(inputExtras.isEmpty()); 3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it is created already 3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(textView.getInputExtras(false)); 3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputExtras(R.xml.input_extras); 3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessContentType() { 3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView textView = new TextView(mActivity); 3890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setText(null, BufferType.EDITABLE); 3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setKeyListener(null); 3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setTransformationMethod(null); 3893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_DATETIME 3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 3896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType()); 3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getKeyListener() instanceof DateTimeKeyListener); 3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_DATETIME 3901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 3902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType()); 3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getKeyListener() instanceof DateKeyListener); 3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_DATETIME 3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType()); 3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getKeyListener() instanceof TimeKeyListener); 3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_NUMBER 3913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 3914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 3915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 3916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 3917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType()); 3918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(textView.getKeyListener(), DigitsKeyListener.getInstance(true, true)); 3919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_PHONE); 3921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType()); 3922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getKeyListener() instanceof DialerKeyListener); 3923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_TEXT 3925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 3926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 3927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType()); 3928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(textView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE)); 3929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setSingleLine(); 3931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 3932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_TEXT 3933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 3934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 3935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 3936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 3937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType()); 3938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(textView.getKeyListener(), 3939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.CHARACTERS)); 3940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 3941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_TEXT 3943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 3944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 3945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType()); 3946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(textView.getKeyListener(), 3947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.WORDS)); 3948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 3949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_CLASS_TEXT 3951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 3952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 3953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType()); 3954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(textView.getKeyListener(), 3955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.SENTENCES)); 3956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setInputType(InputType.TYPE_NULL); 3958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_NULL, textView.getInputType()); 3959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getKeyListener() instanceof TextKeyListener); 3960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessRawContentType() { 3963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView textView = new TextView(mActivity); 3964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setText(null, BufferType.EDITABLE); 3965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setKeyListener(null); 3966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setTransformationMethod(null); 3967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_DATETIME 3969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 3970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL, textView.getInputType()); 3972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 3973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 3974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_DATETIME 3976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 3977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE, textView.getInputType()); 3979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 3980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 3981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_DATETIME 3983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 3984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 3985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME, textView.getInputType()); 3986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 3987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 3988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_NUMBER 3990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 3991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 3992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 3993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 3994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED, textView.getInputType()); 3995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 3996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 3997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_PHONE); 3999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_PHONE, textView.getInputType()); 4000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 4001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_TEXT 4004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, textView.getInputType()); 4007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getTransformationMethod()); 4008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setSingleLine(); 4011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_TEXT 4013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, textView.getInputType()); 4018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_TEXT 4022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS, textView.getInputType()); 4025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_CLASS_TEXT 4029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, textView.getInputType()); 4032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su textView.setRawInputType(InputType.TYPE_NULL); 4036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getKeyListener()); 4038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testOnPrivateIMECommand() { 4041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Do not test. Implementation details. 4042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 404472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testFoo() { 404572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // Do not test. Implementation details. 404672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 404772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 404872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testVerifyDrawable() { 404972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach MockTextView textView = new MockTextView(mActivity); 405072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 40519776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable d = getDrawable(R.drawable.pass); 405272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(textView.verifyDrawable(d)); 405372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 405472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach textView.setCompoundDrawables(null, d, null, null); 405572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(textView.verifyDrawable(d)); 405672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 405772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 405872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessPrivateImeOptions() { 405972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 406072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 406172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 406272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3"); 406372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions()); 406472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 406572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions(null); 406672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 406772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 406872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 406972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetOnEditorActionListener() { 407072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 407172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 407298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView.OnEditorActionListener mockOnEditorActionListener = 407398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mock(TextView.OnEditorActionListener.class); 407498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 407572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 407698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setOnEditorActionListener(mockOnEditorActionListener); 407798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 407872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 407972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE); 408098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockOnEditorActionListener, times(1)).onEditorAction(mTextView, 408198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov EditorInfo.IME_ACTION_DONE, null); 408272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 408372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 408472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeOptions() { 408572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 408672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 408772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 408872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_GO); 408972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions()); 409072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 409172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE); 409272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions()); 409372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 409472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_NULL); 409572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 409672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 409772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 409872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeActionLabel() { 409972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 410072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getImeActionLabel()); 410172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getImeActionId()); 410272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 410372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeActionLabel("pinyin", 1); 410472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("pinyin", mTextView.getImeActionLabel().toString()); 410572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(1, mTextView.getImeActionId()); 410672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 410772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4108d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa public void testAccessImeHintLocales() { 4109d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final TextView textView = new TextView(mActivity); 4110d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setText("", BufferType.EDITABLE); 4111d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setKeyListener(null); 4112d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setRawInputType(InputType.TYPE_CLASS_TEXT); 4113d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(textView.getImeHintLocales()); 4114d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4115d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4116d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4117d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(editorInfo.hintLocales); 4118d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4119d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4120d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US"); 4121d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setImeHintLocales(localeList); 4122d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, textView.getImeHintLocales()); 4123d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4124d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4125d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4126d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, editorInfo.hintLocales); 4127d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4128d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4129d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4130c873101a88e7ba584065de5e912508237378ca99Victoria Lease @UiThreadTest 413172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetExtractedText() { 413272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 413372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 413472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.getText().toString()); 413572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 413672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText et = new ExtractedText(); 4137ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4138ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text and selection. 413972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach et.text = "test"; 4140ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 0; 4141ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 2; 414272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 414372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setExtractedText(et); 414472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("test", mTextView.getText().toString()); 4145ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(0, mTextView.getSelectionStart()); 4146ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionEnd()); 4147ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4148ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Use partialStartOffset and partialEndOffset 4149ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 2; 4150ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4151ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = "x"; 4152ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 2; 4153ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 3; 4154ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4155ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4156ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4157ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionStart()); 4158ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, mTextView.getSelectionEnd()); 4159ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4160ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text with spans. 4161ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final SpannableString ss = new SpannableString("ex"); 4162ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new UnderlineSpan(), 0, 2, 0); 4163ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0); 4164ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4165ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = ss; 4166ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 1; 4167ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4168ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4169ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4170ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4171ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final Editable editable = mTextView.getEditableText(); 4172ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans( 4173ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), UnderlineSpan.class); 4174ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, underlineSpans.length); 4175ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, editable.getSpanStart(underlineSpans[0])); 4176ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(underlineSpans[0])); 4177ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4178ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final URLSpan[] urlSpans = mTextView.getEditableText().getSpans( 4179ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), URLSpan.class); 4180ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, urlSpans.length); 4181ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, editable.getSpanStart(urlSpans[0])); 4182ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(urlSpans[0])); 4183ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("ctstest://TextView/test", urlSpans[0].getURL()); 418472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 418572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 418672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testMoveCursorToVisibleOffset() throws Throwable { 418772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 418872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 418972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // not a spannable text 419072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach runTestOnUiThread(new Runnable() { 419172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void run() { 419272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.moveCursorToVisibleOffset()); 419372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 419472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 419572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 419672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 419772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a selection range 419872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach final String spannableText = "text"; 419972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 420072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 420172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach runTestOnUiThread(new Runnable() { 420272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void run() { 420372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText(spannableText, BufferType.SPANNABLE); 420472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 420572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 420672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 420772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length()); 420872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 420972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getSelectionStart()); 421072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(spannableText.length(), mTextView.getSelectionEnd()); 421172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach runTestOnUiThread(new Runnable() { 421272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void run() { 421372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.moveCursorToVisibleOffset()); 421472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 421572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 421672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 421772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 421872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a spannable without range 421972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach runTestOnUiThread(new Runnable() { 422072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void run() { 422172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 422272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText(spannableText, BufferType.SPANNABLE); 422372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 422472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 422572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 422672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 422772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach runTestOnUiThread(new Runnable() { 422872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void run() { 422972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.moveCursorToVisibleOffset()); 423072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 423172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 423272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 423372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 423472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4235afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void testIsInputMethodTarget() throws Throwable { 423672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 423772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isInputMethodTarget()); 423872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 423972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isFocused()); 4240afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu runTestOnUiThread(new Runnable() { 4241afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu @Override 4242afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void run() { 4243afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mTextView.setFocusable(true); 4244afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mTextView.requestFocus(); 4245afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu } 4246afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu }); 4247afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mInstrumentation.waitForIdleSync(); 4248afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu assertTrue(mTextView.isFocused()); 424904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu 425004d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu new PollingCheck() { 425104d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu @Override 425204d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu protected boolean check() { 425304d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu return mTextView.isInputMethodTarget(); 425404d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu } 425504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu }.run(); 425672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 425772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 425872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBeginEndBatchEdit() { 425972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 426072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 426172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.beginBatchEdit(); 426272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.endBatchEdit(); 426372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 426472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 426572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 426672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBringPointIntoView() throws Throwable { 426772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 426872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(1)); 426972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 427072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.layout(0, 0, 100, 100); 427172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(2)); 427272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 427372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 427472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testCancelLongPress() { 427572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 427672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach TouchUtils.longClickView(this, mTextView); 427772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.cancelLongPress(); 427872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 427972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 428072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 428172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testClearComposingText() { 428272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 428372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText("Hello world!", BufferType.SPANNABLE); 428472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Spannable text = (Spannable) mTextView.getText(); 428572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 428672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 428772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 428872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 428972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach BaseInputConnection.setComposingSpans((Spannable) mTextView.getText()); 429072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 429172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 429272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 429372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.clearComposingText(); 429472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 429572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 429672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 429772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 429872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testComputeVerticalScrollExtent() { 429972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach MockTextView textView = new MockTextView(mActivity); 430072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, textView.computeVerticalScrollExtent()); 430172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 43029776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio Drawable d = getDrawable(R.drawable.pass); 430372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach textView.setCompoundDrawables(null, d, null, d); 430472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 430572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, textView.computeVerticalScrollExtent()); 430672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 430772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 430872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 430972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testDidTouchFocusSelect() { 4310c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne mTextView = new EditText(mActivity); 431172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.didTouchFocusSelect()); 431272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 431372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setFocusable(true); 431472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.requestFocus(); 431572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.didTouchFocusSelect()); 431672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 431772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 43180ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka public void testSelectAllJustAfterTap() { 43190ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Prepare an EditText with focus. 43200ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mActivity.runOnUiThread(new Runnable() { 43210ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka public void run() { 43220ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mTextView = new EditText(mActivity); 43230ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mActivity.setContentView(mTextView); 43240ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 43250ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertFalse(mTextView.didTouchFocusSelect()); 43260ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mTextView.setFocusable(true); 43270ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mTextView.requestFocus(); 43280ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertTrue(mTextView.didTouchFocusSelect()); 43290ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 43300ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mTextView.setText("Hello, World.", BufferType.SPANNABLE); 43310ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 43320ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 43330ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 43340ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 43350ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Tap the view to show InsertPointController. 43360ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka TouchUtils.tapView(this, mTextView); 433783a70cb57c839148a4feff786cdbb3803828d484Bobby Wang // bad workaround for waiting onStartInputView of LeanbackIme.apk done 433883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang try { 433983a70cb57c839148a4feff786cdbb3803828d484Bobby Wang Thread.sleep(1000); 434083a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } catch (InterruptedException e) { 434183a70cb57c839148a4feff786cdbb3803828d484Bobby Wang e.printStackTrace(); 434283a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } 43430ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 43440ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Execute SelectAll context menu. 43450ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mActivity.runOnUiThread(new Runnable() { 43460ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka public void run() { 43470ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mTextView.onTextContextMenuItem(android.R.id.selectAll); 43480ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 43490ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 43500ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 43510ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 43520ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // The selection must be whole of the text contents. 43530ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(0, mTextView.getSelectionStart()); 435483a70cb57c839148a4feff786cdbb3803828d484Bobby Wang assertEquals("Hello, World.", mTextView.getText().toString()); 43550ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(mTextView.length(), mTextView.getSelectionEnd()); 43560ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 43570ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 435872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testExtractText() { 435972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 436072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 436172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedTextRequest request = new ExtractedTextRequest(); 436272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText outText = new ExtractedText(); 436372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 436472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.token = 0; 436572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.flags = 10; 436672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxLines = 2; 436772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxChars = 20; 436872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 436972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 437072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 437172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 437272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 437372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 437472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach outText.text.toString()); 4375c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi 4376c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi // Tests for invalid arguments. 4377c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(request, null)); 4378c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, outText)); 4379c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, null)); 438072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 438172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 438294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 438394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testTextDirectionDefault() { 4384c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 43852a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 438694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 438794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 438894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 438994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testSetGetTextDirection() { 4390c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 439194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 439294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 43932a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection()); 439494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 439594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 43962a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection()); 439794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 439894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 43992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 440094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 440194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 44022a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection()); 440394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 440494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 44052a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection()); 440694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 440794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 44082a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection()); 440902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 441002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 441102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection()); 441202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 441302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 441402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection()); 441594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 441694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 441794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 441894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtr() { 4419c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 442094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 442194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 44222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 442394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 442494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 44252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 442694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 442794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 44282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 442994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 443094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 44312a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 443294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 443394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 44342a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 443594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 443694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 44372a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 443894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 443994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 44402a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 444102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 444202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 444302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 444402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 444502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 444602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 444794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 444894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 444994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 445094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtrWithInheritance() { 4451c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 445294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 445394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 4454c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 445594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 445694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 445794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 445894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 44592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 446094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 446194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 44622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 446394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 446494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 44652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 446694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 446794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 44682a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 446994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 447094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 44712a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 447294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 447394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 44742a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 447502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 447602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 447702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 447802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 447902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 448002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 448194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 448294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 448394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 448494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtl() { 4485c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 448694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 448794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 44882a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 448994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 449094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 44912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 449294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 449394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 44942a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 449594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 449694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 44972a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 449894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 449994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 45002a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 450194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 450294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 45032a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 450494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 450594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 45062a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 450702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 450802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 450902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 451002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 451102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 451202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 451394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 451494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 451594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 451694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtlWithInheritance() { 4517c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 451894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 451994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 4520c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 452194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 452294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 452394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 452494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 45252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 452694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 452794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 45282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 452994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 453094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 45312a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 453294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 453394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 45342a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 453594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 453694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 45372a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 453894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 453994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 45402a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 454194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 454202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 454302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 454402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 454502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 454602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 454702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 454894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio // Force to RTL text direction on the layout 454994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 455094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 455194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 45522a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 455394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 455494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 45552a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 455694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 455794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 45582a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 455994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 456094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 45612a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 456294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 456394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 45642a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 456594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 456694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 45672a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 456802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 456902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 457002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 457102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 457202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 457302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 457494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 457594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 457694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 457794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testResetTextDirection() { 4578c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 4579c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 458094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 458194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 458294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 45832a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 458494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 4585f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // No reset when we remove the view 458694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.removeView(tv); 4587f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 4588f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio 4589f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // Reset is done when we add the view 4590f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio ll.addView(tv); 45912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 459294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 459394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 459402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 459502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongLtr() { 459602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 459702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 459802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 459902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 460002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 460102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 460202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 460302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 460402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 460502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 460602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 460702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 460802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 460902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 461002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 461102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 461202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 461302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 461402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 461502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 461602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 461702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 461802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 461902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 462002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 462102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 462202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 462302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 462402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 462502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 462602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 462702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 462802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is LTR. 462902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 463002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 463102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 463202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 463302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 463402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 463502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 463602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 463702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 463802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 463902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 464002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 464102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 464202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 464302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 464402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 464502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongRtl() { 464602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 464702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 464802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 464902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 465002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 465102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 465202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 465302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 465402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 465502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 465602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 465702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 465802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 465902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 466002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 466102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 466202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 466302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 466402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 466502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 466602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 466702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 466802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 466902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 467002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 467102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 467202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 467302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 467402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 467502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 467602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 467702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 467802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is RTL. 467902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 468002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 468102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 468202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 468302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 468402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 468502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 468602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 468702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 468802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 468902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 469002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 469102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 469202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 469302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 4694c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader public void testTextLocales() { 4695c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader TextView tv = new TextView(mActivity); 4696c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.getDefault(), tv.getTextLocale()); 4697c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.getDefault(), tv.getTextLocales()); 4698c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4699c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(Locale.CHINESE); 4700c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.CHINESE, tv.getTextLocale()); 4701c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales()); 4702c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4703c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(LocaleList.forLanguageTags("en,ja")); 4704c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale()); 4705c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales()); 4706c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4707c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 4708c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(null); 4709c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to null should throw"); 4710c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 4711c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 4712c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 4713c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4714c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 4715c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(null); 4716c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locales to null should throw"); 4717c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 4718c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 4719c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 4720c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4721c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 4722c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(new LocaleList()); 4723c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to an empty list should throw"); 4724c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 4725c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 4726c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 4727c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 4728c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 4729b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka public void testAllCapsLocalization() { 4730b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka String testString = "abcdefghijklmnopqrstuvwxyz"; 4731b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 4732b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka // The capitalized characters of "i" on Turkish and Azerbaijani are different from English. 4733b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka Locale[] testLocales = { 4734b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("az", "AZ"), 4735b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("tr", "TR"), 4736b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("en", "US"), 4737b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka }; 4738b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 4739b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka TextView tv = new TextView(mActivity); 4740b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setAllCaps(true); 4741b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka for (Locale locale: testLocales) { 4742b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setTextLocale(locale); 4743b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka assertEquals("Locale: " + locale.getDisplayName(), 4744b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka testString.toUpperCase(locale), 4745b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.getTransformationMethod().getTransformation(testString, tv).toString()); 4746b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 4747b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 4748b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 4749dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 4750dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testTextAlignmentDefault() { 4751dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio TextView tv = new TextView(getActivity()); 47527fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 4753dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // resolved default text alignment is GRAVITY 47547fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 4755dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 4756dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4757dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 4758dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testSetGetTextAlignment() { 4759dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio TextView tv = new TextView(getActivity()); 4760dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4761dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 47627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 4763dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4764dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 47657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment()); 4766dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4767dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 47687fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment()); 4769dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4770dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 47717fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment()); 4772dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4773dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 47747fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment()); 4775dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4776dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 47777fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment()); 4778dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 4779dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4780dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 4781dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignment() { 4782dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio TextView tv = new TextView(getActivity()); 4783dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 47847fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 4785dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4786757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test center alignment first so that we dont hit the default case 4787dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 47887fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4789dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4790757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test the default case too 4791757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 4792757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 4793757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio 4794dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 47957fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 4796dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4797dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 47987fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 4799dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4800dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 48017fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 4802dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4803dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 48047fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 4805dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 4806dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4807dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 4808dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignmentWithInheritance() { 4809dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio LinearLayout ll = new LinearLayout(getActivity()); 4810dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 4811dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4812dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio TextView tv = new TextView(getActivity()); 4813dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.addView(tv); 4814dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4815dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // check defaults 48167fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 4817dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 4818dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4819dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // set inherit and check that child is following parent 4820dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 48217fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment()); 4822dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4823dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 48247fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4825dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4826dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 48277fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 4828dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4829dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 48307fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 4831dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4832dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 48337fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 4834dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4835dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 48367fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 4837dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4838dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // now get rid of the inheritance but still change the parent 4839dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 4840dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4841dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 48427fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4843dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4844dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 48457fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4846dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4847dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 48487fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4849dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4850dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 48517fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4852dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4853dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 48547fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4855dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 4856dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4857dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 4858dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testResetTextAlignment() { 48594ca04c0729a0e810b5af16edcd52bb8cb59bf55eChenjie Luo TextViewCtsActivity activity = getActivity(); 4860dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4861dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio LinearLayout ll = (LinearLayout) activity.findViewById(R.id.layout_textviewtest); 4862dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio TextView tv = (TextView) activity.findViewById(R.id.textview_rtl); 4863dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4864dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 4865dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 48667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 4867dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 48684f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // No reset when we remove the view 4869dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.removeView(tv); 48704f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 48714f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio 48724f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Reset is done when we add the view 48734f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Default text alignment is GRAVITY 48744f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio ll.addView(tv); 48757fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 4876dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 4877dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 4878938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov private void verifyCompoundDrawables(@NonNull TextView textView, 4879938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @IdRes int expectedLeftDrawableId, @IdRes int expectedRightDrawableId, 4880938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @IdRes int expectedTopDrawableId, @IdRes int expectedBottomDrawableId) { 4881938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Drawable[] compoundDrawables = textView.getCompoundDrawables(); 4882938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedLeftDrawableId < 0) { 4883938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawables[0]); 4884938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4885938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedLeftDrawableId), 4886938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawables[0]).getBitmap()); 4887938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4888938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedTopDrawableId < 0) { 4889938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawables[1]); 4890938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4891938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedTopDrawableId), 4892938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawables[1]).getBitmap()); 4893938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4894938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedRightDrawableId < 0) { 4895938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawables[2]); 4896938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4897938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedRightDrawableId), 4898938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawables[2]).getBitmap()); 4899938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4900938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedBottomDrawableId < 0) { 4901938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawables[3]); 4902938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4903938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedBottomDrawableId), 4904938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawables[3]).getBitmap()); 4905938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4906938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4907b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4908938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov private void verifyCompoundDrawablesRelative(@NonNull TextView textView, 4909938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @IdRes int expectedStartDrawableId, @IdRes int expectedEndDrawableId, 4910938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @IdRes int expectedTopDrawableId, @IdRes int expectedBottomDrawableId) { 4911938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Drawable[] compoundDrawablesRelative = textView.getCompoundDrawablesRelative(); 4912938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedStartDrawableId < 0) { 4913938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawablesRelative[0]); 4914938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4915938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedStartDrawableId), 4916938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawablesRelative[0]).getBitmap()); 4917938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4918938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedTopDrawableId < 0) { 4919938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawablesRelative[1]); 4920938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4921938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedTopDrawableId), 4922938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawablesRelative[1]).getBitmap()); 4923938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4924938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedEndDrawableId < 0) { 4925938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawablesRelative[2]); 4926938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4927938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedEndDrawableId), 4928938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawablesRelative[2]).getBitmap()); 4929938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4930938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov if (expectedBottomDrawableId < 0) { 4931938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertNull(compoundDrawablesRelative[3]); 4932938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } else { 4933938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov WidgetTestUtils.assertEquals(getBitmap(expectedBottomDrawableId), 4934938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov ((BitmapDrawable) compoundDrawablesRelative[3]).getBitmap()); 4935938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4936938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 4937b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4938938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @UiThreadTest 4939938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testDrawableResolution() { 4940b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 4941938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 4942938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 4943938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4944938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, -1, -1, 4945938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4946b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4947b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.2: left / right drawable defined in default RTL mode 4948938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 4949938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 4950938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4951938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, -1, -1, 4952938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4953b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4954b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.1: start / end drawable defined in LTR mode 4955938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_1); 4956938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 4957938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4958938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4959938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4960b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4961b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.2: start / end drawable defined in RTL mode 4962938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_2); 4963938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 4964938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4965938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4966938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4967b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4968b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.1: left / right / start / end drawable defined in LTR mode 4969938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_1); 4970938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 4971938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4972938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4973938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4974b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4975b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.2: left / right / start / end drawable defined in RTL mode 4976938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_2); 4977938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 4978938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4979938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4980938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4981b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4982b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.1: start / end drawable defined in LTR mode inside a layout 4983b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 4984938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_1); 4985938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 4986938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4987938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4988938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4989b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4990b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.2: start / end drawable defined in RTL mode inside a layout 4991b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 4992938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_2); 4993938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 4994938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4995938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 4996938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 4997b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 4998b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout 4999b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5000938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_1); 5001938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5002938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5003938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5004938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5005b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5006b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout 5007b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5008938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_2); 5009938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5010938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5011938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5012938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5013b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio } 5014b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 50159776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio @UiThreadTest 50169776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio public void testDrawableResolution2() { 50179776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5018938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5019938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5020938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 50219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 50229776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio tv.setCompoundDrawables(null, null, getDrawable(R.drawable.icon_yellow), null); 5023938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, -1, R.drawable.icon_yellow, -1, -1); 50249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5025938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5026938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5027938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 50289776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5029938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv.setCompoundDrawables(getDrawable(R.drawable.icon_yellow), null, null, null); 5030938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 50319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5032938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_ltr); 5033938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, -1, -1, -1, -1); 50349776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5035938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv.setCompoundDrawables(getDrawable(R.drawable.icon_blue), null, 5036938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov getDrawable(R.drawable.icon_red), null); 5037938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, -1, -1); 50389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 50399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio tv.setCompoundDrawablesRelative(getDrawable(R.drawable.icon_yellow), null, null, null); 5040938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 5041938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 5042938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5043938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testCompoundAndTotalPadding() { 5044938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Resources res = mActivity.getResources(); 5045938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int drawablePadding = res.getDimensionPixelSize(R.dimen.textview_drawable_padding); 5046938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingLeft = res.getDimensionPixelSize(R.dimen.textview_padding_left); 5047938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingRight = res.getDimensionPixelSize(R.dimen.textview_padding_right); 5048938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingTop = res.getDimensionPixelSize(R.dimen.textview_padding_top); 5049938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingBottom = res.getDimensionPixelSize(R.dimen.textview_padding_bottom); 5050938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int iconSize = TestUtils.dpToPx(mActivity, 32); 5051938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5052938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewLtr = (TextView) mActivity.findViewById( 5053938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_ltr); 5054938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftLtr = paddingLeft + drawablePadding + iconSize; 5055938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightLtr = paddingRight + drawablePadding + iconSize; 5056938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingLeft()); 5057938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingStart()); 5058938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingLeft()); 5059938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingStart()); 5060938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingRight()); 5061938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingEnd()); 5062938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingRight()); 5063938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingEnd()); 5064938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5065938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingTop()); 5066938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5067938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingBottom()); 5068938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5069938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewRtl = (TextView) mActivity.findViewById( 5070938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_rtl); 5071938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftRtl = paddingLeft + drawablePadding + iconSize; 5072938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightRtl = paddingRight + drawablePadding + iconSize; 5073938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingLeft()); 5074938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingEnd()); 5075938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingLeft()); 5076938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingEnd()); 5077938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingRight()); 5078938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingStart()); 5079938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingRight()); 5080938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingStart()); 5081938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5082938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingTop()); 5083938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5084938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingBottom()); 50859776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 50869776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5087e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetBreakStrategy() { 5088e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5089e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 50902751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka final PackageManager pm = getInstrumentation().getTargetContext().getPackageManager(); 50912751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka 5092d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for 50932751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // TextView except for Android Wear. The default value for Android Wear is 50942751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // BREAK_STRATEGY_BALANCED. 50952751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { 50962751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // Android Wear 50972751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 50982751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } else { 50992751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // All other form factor. 51002751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 51012751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } 5102e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5103e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5104e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy()); 5105e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5106e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5107e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 5108e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5109e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5110e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 5111d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5112d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi EditText et = new EditText(mActivity); 5113d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5114d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for 5115d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // EditText. 5116d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5117d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5118d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5119d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5120d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5121d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5122d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy()); 5123d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5124d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5125d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy()); 5126e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5127e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5128e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetHyphenationFrequency() { 5129e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5130e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5131d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5132e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5133e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 5134e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency()); 5135e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5136e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); 5137e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5138e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5139e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); 5140e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency()); 5141e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5142e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 514332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void testSetAndGetCustomSelectionActionModeCallback() { 514432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final String text = "abcde"; 514532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 514632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void run() { 514732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView = new EditText(mActivity); 514832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.setContentView(mTextView); 514932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.setText(text, BufferType.SPANNABLE); 515032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.setTextIsSelectable(true); 515132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.requestFocus(); 515232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.setSelected(true); 515332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 515432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 515532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 515632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 515732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 515832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomSelectionActionModeCallback()); 515932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 516098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 516198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 516298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 516398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomSelectionActionModeCallback(mockActionModeCallback); 516498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, 516532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.getCustomSelectionActionModeCallback()); 516632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 516732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 516832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void run() { 516932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Set selection and try to start action mode. 517032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final Bundle args = new Bundle(); 517132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 517232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 51738e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette mTextView.performAccessibilityAction( 517432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 517532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 517632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 517732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 517832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 517998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 518098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 518132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 518232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 518332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void run() { 518432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Remove selection and stop action mode. 518532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.copy); 518632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 518732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 518832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 518932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 519032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was blocked. 519198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, never()).onDestroyActionMode(any(ActionMode.class)); 519232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 519398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov // Reset and reconfigure callback. 519498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockActionModeCallback); 519598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 519698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.TRUE); 519798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomSelectionActionModeCallback()); 519832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 519932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 520032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void run() { 520132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Set selection and try to start action mode. 520232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final Bundle args = new Bundle(); 520332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 520432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 52058e92940803ad8d05bfeecdd6ef3abfe803c5a782Alan Viverette mTextView.performAccessibilityAction( 520632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 520732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 520832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 520932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 521032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 521132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 521298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 521398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 521432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 521532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mActivity.runOnUiThread(new Runnable() { 521632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi public void run() { 521732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Remove selection and stop action mode. 521832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.copy); 521932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 522032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 522132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 522232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 522332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was started 522498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onDestroyActionMode(any(ActionMode.class)); 522532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 522632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 522798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testSetAndGetCustomInsertionActionMode() { 522832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi initTextViewForTyping(); 522932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 523032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomInsertionActionModeCallback()); 523132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 523298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 523398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 523498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 523598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomInsertionActionModeCallback(mockActionModeCallback); 523698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomInsertionActionModeCallback()); 523732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // TODO(Bug: 22033189): Tests the set callback is actually used. 523832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 523932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 524098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testTextShadows() { 524198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textViewWithConfiguredShadow = 524298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov (TextView) mActivity.findViewById(R.id.textview_with_shadow); 524398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(1.0f, textViewWithConfiguredShadow.getShadowDx()); 524498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2.0f, textViewWithConfiguredShadow.getShadowDy()); 524598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(3.0f, textViewWithConfiguredShadow.getShadowRadius()); 524698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.GREEN, textViewWithConfiguredShadow.getShadowColor()); 524732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 524898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 524998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(0.0f, textView.getShadowDx()); 525098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(0.0f, textView.getShadowDy()); 525198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(0.0f, textView.getShadowRadius()); 525232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 525398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mActivity.runOnUiThread(() -> textView.setShadowLayer(5.0f, 3.0f, 4.0f, Color.RED)); 525498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mInstrumentation.waitForIdleSync(); 525598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(3.0f, textView.getShadowDx()); 525698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(4.0f, textView.getShadowDy()); 525798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(5.0f, textView.getShadowRadius()); 525898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.RED, textView.getShadowColor()); 525972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 526072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void layout(final TextView textView) { 5262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(textView); 5265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void layout(final int layoutId) { 5271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(layoutId); 5274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView findTextView(int id) { 5280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return (TextView) mActivity.findViewById(id); 5281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private int getAutoLinkMask(int id) { 5284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return findTextView(id).getAutoLinkMask(); 5285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Bitmap getBitmap(int resid) { 52889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio return ((BitmapDrawable) getDrawable(resid)).getBitmap(); 52899776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 52909776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 52919776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio private Drawable getDrawable(int resid) { 52929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio return mActivity.getResources().getDrawable(resid); 5293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMaxWidth(final int pixels) { 5296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxWidth(pixels); 5299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMinWidth(final int pixels) { 5305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMinWidth(pixels); 5308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMaxHeight(final int pixels) { 5314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxHeight(pixels); 5317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMinHeight(final int pixels) { 5323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMinHeight(pixels); 5326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMinLines(final int minlines) { 5332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMinLines(minlines); 5335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 5341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And 5342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * the buffer type is fixed to SPANNABLE. 5343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * 5344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param tv the text view 5345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param content the content 5346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 5347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setSpannableText(final TextView tv, final String content) { 5348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(content, BufferType.SPANNABLE); 5351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setLines(final int lines) { 5357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(lines); 5360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setHorizontallyScrolling(final boolean whether) { 5366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHorizontallyScrolling(whether); 5369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setWidth(final int pixels) { 5375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(pixels); 5378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setHeight(final int pixels) { 5384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHeight(pixels); 5387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMinEms(final int ems) { 5393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMinEms(ems); 5396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setMaxEms(final int ems) { 5402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxEms(ems); 5405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setEms(final int ems) { 5411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEms(ems); 5414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private void setLineSpacing(final float add, final float mult) { 5420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.runOnUiThread(new Runnable() { 5421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 5422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(add, mult); 5423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 5425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 5426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestSelectedRunnable implements Runnable { 5429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 5430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected1; 5431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected2; 5432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestSelectedRunnable(TextView textview) { 5434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 5435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected1() { 5438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected1; 5439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected2() { 5442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected2; 5443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected1() { 5446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected1 = mTextView.isSelected(); 5447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected2() { 5450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected2 = mTextView.isSelected(); 5451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestLayoutRunnable implements Runnable { 5455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 5456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Layout mLayout; 5457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestLayoutRunnable(TextView textview) { 5459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 5460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public Layout getLayout() { 5463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mLayout; 5464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveLayout() { 5467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mLayout = mTextView.getLayout(); 5468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static class MockTextWatcher implements TextWatcher { 5472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledAfterTextChanged; 5473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledBeforeTextChanged; 5474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasOnTextChanged; 5475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void reset(){ 5477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = false; 5478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = false; 5479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = false; 5480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledAfterTextChanged() { 5483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledAfterTextChanged; 5484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledBeforeTextChanged() { 5487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledBeforeTextChanged; 5488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledOnTextChanged() { 5491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasOnTextChanged; 5492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void afterTextChanged(Editable s) { 5495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = true; 5496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void beforeTextChanged(CharSequence s, int start, int count, int after) { 5499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = true; 5500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void onTextChanged(CharSequence s, int start, int before, int count) { 5503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = true; 5504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 5508277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook * A TextWatcher that converts the text to spaces whenever the text changes. 5509277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook */ 5510277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook private static class ConvertToSpacesTextWatcher implements TextWatcher { 5511277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook boolean mChangingText; 5512277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 5513277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 5514277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void beforeTextChanged(CharSequence s, int start, int count, int after) { 5515277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5516277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 5517277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 5518277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void onTextChanged(CharSequence s, int start, int before, int count) { 5519277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5520277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 5521277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 5522277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void afterTextChanged(Editable s) { 5523277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Avoid infinite recursion. 5524277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook if (mChangingText) { 5525277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook return; 5526277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5527277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = true; 5528277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Create a string of s.length() spaces. 5529277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook StringBuilder builder = new StringBuilder(s.length()); 5530277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook for (int i = 0; i < s.length(); i++) { 5531277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook builder.append(' '); 5532277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5533277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook s.replace(0, s.length(), builder.toString()); 5534277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = false; 5535277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5536277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 5537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su} 5538