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