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