TextViewTest.java revision 598f12bd40473f091c368fb5d483b3ca2acee604
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 1955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanuimport static org.junit.Assert.assertArrayEquals; 20a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertEquals; 21a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertFalse; 22069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanuimport static org.junit.Assert.assertNotEquals; 23a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertNotNull; 24a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertNull; 25a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertSame; 26a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.assertTrue; 27a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.junit.Assert.fail; 28a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Matchers.any; 2909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Tokiimport static org.mockito.Matchers.anyInt; 30a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Matchers.eq; 31a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Matchers.refEq; 32a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doAnswer; 33a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doCallRealMethod; 34a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doNothing; 35a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.mock; 36a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.never; 37a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.reset; 38a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.spy; 39a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.times; 40a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verify; 41a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verifyNoMoreInteractions; 42a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verifyZeroInteractions; 43a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.when; 44be24fc17bf75d329d40d8acce9e22d8d3ff30f1fAurimas Liutikas 45fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity; 46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation; 47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor; 48354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.content.Context; 49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent; 502751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager; 51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList; 52938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.content.res.Resources; 53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException; 54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color; 55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint; 56afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path; 579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.graphics.Point; 58fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff; 59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect; 60afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF; 61fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface; 62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable; 63ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable; 64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable; 65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri; 66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle; 67354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Handler; 68265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList; 69354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Looper; 705b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable; 71354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.ResultReceiver; 7257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.os.SystemClock; 73a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.InstrumentationRegistry; 74a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.annotation.UiThreadTest; 753763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.MediumTest; 763763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.SmallTest; 77a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.rule.ActivityTestRule; 78a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.runner.AndroidJUnit4; 79fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable; 80fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter; 81fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType; 82fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout; 83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection; 84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable; 85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString; 86ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned; 87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint; 88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils; 89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt; 90afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher; 91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod; 92fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener; 93fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener; 94fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener; 95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener; 96fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener; 97fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod; 98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod; 99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod; 100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener; 101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod; 102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener; 103afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize; 104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener; 105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod; 10657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.text.style.ClickableSpan; 10798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan; 108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan; 109ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan; 110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify; 111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics; 1129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.util.SparseArray; 113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue; 114ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode; 115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu; 116afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ContextMenu.ContextMenuInfo; 117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity; 11857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.InputDevice; 119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent; 12032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu; 12157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.MotionEvent; 12257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.PointerIcon; 123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View; 1249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewConfiguration; 125afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup; 1269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewGroup.LayoutParams; 12732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo; 12872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection; 12918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinirimport android.view.inputmethod.CompletionInfo; 13071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagiimport android.view.inputmethod.CorrectionInfo; 13172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo; 13272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText; 13372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest; 134c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection; 135354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.view.inputmethod.InputMethodManager; 13609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Tokiimport android.view.textclassifier.TextClassificationResult; 137ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextClassifier; 138ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextSelection; 139c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText; 140bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout; 14162808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout; 142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller; 143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView; 144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType; 145938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.widget.cts.util.TestUtils; 146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1479259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsKeyEventUtil; 1489259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsTouchUtils; 1499259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.PollingCheck; 1509259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.WidgetTestUtils; 1519259176007f5aad8fb9c79abb725b40c89327c40Aaron Holden 152a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Before; 153a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Rule; 154a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Test; 155a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.runner.RunWith; 156938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.invocation.InvocationOnMock; 157ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException; 158ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException; 16055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanuimport java.util.Arrays; 161b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale; 162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/** 164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}. 165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 166a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@MediumTest 167a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@RunWith(AndroidJUnit4.class) 168a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovpublic class TextViewTest { 169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Instrumentation mInstrumentation; 170a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private Activity mActivity; 171a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private TextView mTextView; 1729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mSecondTextView; 173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final String LONG_TEXT = "This is a really long string which exceeds " 1757375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "the width of the view. New devices have a much larger screen which " 1767375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "actually enables long strings to be displayed with no fading. " 1777375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "I have made this string longer to fix this case. If you are correcting " 1787375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "this text, I would love to see the kind of devices you guys now use!"; 179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final long TIMEOUT = 5000; 18009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 18109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_START = 0; 18209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_END = 40; 18309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int CLICK_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 50; 18409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 18522d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root private CharSequence mTransformedText; 186354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private Handler mHandler = new Handler(Looper.getMainLooper()); 187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 188a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Rule 189a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public ActivityTestRule<TextViewCtsActivity> mActivityRule = 190a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov new ActivityTestRule<>(TextViewCtsActivity.class); 191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 192a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Before 193a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public void setup() { 194a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation = InstrumentationRegistry.getInstrumentation(); 195a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mActivity = mActivityRule.getActivity(); 196b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mActivity::hasWindowFocus); 197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 19928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook /** 2006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Promotes the TextView to editable and places focus in it to allow simulated typing. Used in 201a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov * test methods annotated with {@link UiThreadTest}. 20228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook */ 20328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook private void initTextViewForTyping() { 2046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 2066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 2076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 208ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // Disable smart selection 209ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 2106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu } 2116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 2126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu /** 2136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Used in test methods that can not entirely be run on the UiThread (e.g: tests that need to 2146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * emulate touches and/or key presses). 2156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu */ 2164b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void initTextViewForTypingOnUiThread() throws Throwable { 2174b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(this::initTextViewForTyping); 21828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mInstrumentation.waitForIdleSync(); 21928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 22028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 221047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @UiThreadTest 222a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 223047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOnUiThread() { 224047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 225047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 227047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @Test 228047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOffUiThread() { 229047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 230047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 232047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu private void verifyConstructor() { 233047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity); 234047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity, null); 235938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, android.R.attr.textViewStyle); 236f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_TextView); 237f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_TextView); 238f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_TextView); 239938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_Light_TextView); 240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 243a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessText() { 245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String expected = mActivity.getResources().getString(R.string.text_view_hello); 248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(expected); 249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, tv.getText().toString()); 250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null); 252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 256a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineHeight() { 258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(1.2f, 1.5f); 262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 265a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2664b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLayout() throws Throwable { 2679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 2686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER); 270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) { 275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the text of TextView. 277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello, Android!"); 278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveLayout(); 279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 2819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(runnable.getLayout()); 284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 287a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2884b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessKeyListener() throws Throwable { 2899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getKeyListener()); 293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final KeyListener digitsKeyListener = DigitsKeyListener.getInstance(); 295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(digitsKeyListener)); 297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(digitsKeyListener, mTextView.getKeyListener()); 299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 3029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(qwertyKeyListener)); 303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(qwertyKeyListener, mTextView.getKeyListener()); 305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 307a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMovementMethod() throws Throwable { 309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified " 310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "coordinates, except constrains the X scrolling position to the horizontal " 311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "regions of the text that will be visible after scrolling to " 312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "the specified Y position."; 313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionStart = 10; 314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionEnd = LONG_TEXT.length(); 315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance(); 3169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 3186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(movementMethod); 3196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(LONG_TEXT, BufferType.EDITABLE); 3206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(movementMethod, mTextView.getMovementMethod()); 327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 329b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 330b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection has been removed. 332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText())); 334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(null); 3376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 346b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 347b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection will not be changed. 349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 354a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testLength() { 356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is content"; 359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content); 360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.length()); 361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(""); 363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 370a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessGravity() { 372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_gravity); 373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_default); 3754bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_bottom); 3784bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity()); 379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_right); 381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center); 384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_fill); 387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center_vertical_right); 390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity()); 391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity()); 394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL); 395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.NO_GRAVITY); 4004bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL_VERTICAL); 4064bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity()); 407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //test negative input value. 409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(-1); 410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getGravity()); 411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 413a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4144b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessAutoLinkMask() throws Throwable { 415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text1 = 417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("URL: http://www.google.com. mailto: account@gmail.com"); 4189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 4196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.ALL); 4206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text1, BufferType.EDITABLE); 421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, mTextView.getAutoLinkMask()); 424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Spannable spanString = (Spannable) mTextView.getText(); 426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("http://www.google.com", spans[0].getURL()); 430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("mailto:account@gmail.com", spans[1].getURL()); 431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text2 = 433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("name: Jack. tel: +41 44 800 8999"); 4349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 4356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 4366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text2, BufferType.EDITABLE); 437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask()); 440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spanString = (Spannable) mTextView.getText(); 442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("tel:+41448008999", spans[0].getURL()); 446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_autolink); 448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone) 449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, getAutoLinkMask(R.id.autolink_default)); 450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web)); 451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email)); 452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone)); 453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all)); 454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES, 455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound1)); 456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, 457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound2)); 458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS, 459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound3)); 460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL, 461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound4)); 462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 465a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextSize() { 467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f); 471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics), 472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f); 475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics), 476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextSize by default unit "sp" 483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(20f); 484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(200f); 488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics), 489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 493a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextColor() { 495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.GREEN); 498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentTextColor()); 499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors()); 500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.BLACK); 502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors()); 504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.RED); 506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentTextColor()); 507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors()); 508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(colors); 515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getTextColors()); 516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(null); 521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should thrown exception if the colors is null"); 522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e){ 523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 526a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 527325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette public void testGetTextColor() { 528325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette // TODO: How to get a suitable TypedArray to test this method. 529325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 530325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette try { 531325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette TextView.getTextColor(mActivity, null, -1); 532325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette fail("There should be a NullPointerException thrown out."); 533325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } catch (NullPointerException e) { 534325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 535325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 536325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 537a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5384b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessHighlightColor() throws Throwable { 539354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 540354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 542354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setTextIsSelectable(true); 543354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setText("abcd", BufferType.EDITABLE); 544354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setHighlightColor(Color.BLUE); 545354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov }); 546354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 547354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 548354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(textView.isTextSelectable()); 549354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.BLUE, textView.getHighlightColor()); 550354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 551354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Long click on the text selects all text and shows selection handlers. The view has an 552354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // attribute layout_width="wrap_content", so clicked location (the center of the view) 553354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // should be on the text. 5549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, textView); 555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 556354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // At this point the entire content of our TextView should be selected and highlighted 557354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // with blue. Now change the highlight to red while the selection is still on. 5589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.RED)); 559354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 560354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 561354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.RED, textView.getHighlightColor()); 562354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 563354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 564354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Remove the selection 5659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) textView.getText())); 566354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 567354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 568354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And switch highlight to green after the selection has been removed 5699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.GREEN)); 570354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 571354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 572354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.GREEN, textView.getHighlightColor()); 573354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 577a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetShadowLayer() { 5796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test values 5806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final MockTextView mockTextView = new MockTextView(mActivity); 5816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.4f, Color.CYAN); 5836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(Color.CYAN, mockTextView.getShadowColor()); 584a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.3f, mockTextView.getShadowDx(), 0.0f); 585a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.4f, mockTextView.getShadowDy(), 0.0f); 586a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mockTextView.getShadowRadius(), 0.0f); 587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the left and below the text 5896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN); 5906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 5916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 5926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 5936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getRightPaddingOffset()); 5946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getBottomPaddingOffset()); 595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the right and above the text 5976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN); 5986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 5996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getLeftPaddingOffset()); 6006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getTopPaddingOffset()); 6016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 6026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // no shadow 6056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN); 6066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(mockTextView.isPaddingOffsetRequired()); 6076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 6086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 6096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 6106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 614a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSelectAllOnFocus() { 616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_selectallonfocus); 617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is the content"; 618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String blank = ""; 619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.selectAllOnFocus_default); 620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content, BufferType.SPANNABLE); 631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.getSelectionEnd()); 640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(blank.length(), mTextView.getSelectionEnd()); 662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 676a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetPaint() { 678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextPaint tp = mTextView.getPaint(); 680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(tp); 681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaintFlags(), tp.getFlags()); 683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 686a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinksClickable() { 688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_true); 694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_false); 697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(false); 700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(true); 703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999"); 708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Movement method will be automatically set to LinkMovementMethod 713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod); 714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 717a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHintTextColor() { 719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using int values 721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.GREEN); 723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor()); 724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors()); 725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.BLUE); 727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors()); 728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor()); 729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.RED); 731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors()); 732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentHintTextColor()); 733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(colors); 740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getHintTextColors()); 741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor()); 742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(null); 745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHintTextColors()); 746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor()); 747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 750a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinkTextColor() { 752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.GRAY); 755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors()); 756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GRAY, mTextView.getPaint().linkColor); 757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.YELLOW); 759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors()); 760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.YELLOW, mTextView.getPaint().linkColor); 761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.WHITE); 763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors()); 764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.WHITE, mTextView.getPaint().linkColor); 765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_expanded}, new int[0] }, 768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(colors); 770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getLinkTextColors()); 771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(null); 774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLinkTextColors()); 775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 779a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessPaintFlags() { 781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 78253959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG 78353959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags()); 784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG); 786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG, 787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG); 790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG, 791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 794a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 7954b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testHeight() throws Throwable { 796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 7976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalHeight = mTextView.getHeight(); 798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMaxHeight 8006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newHeight = originalHeight + 1; 8016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 8036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 8066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 8076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 8086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 8116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 8136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = Integer.MAX_VALUE; 8166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 8186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMinHeight 8216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 8226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 8236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 8246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 8276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 8296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 8326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 8346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // reset min and max height 837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(0); 838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setHeight 8416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 8426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 8436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 8446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 8456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 8466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 8476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 8486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 8496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 8506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 8516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 8526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 8536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 8546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 8566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 8576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight); 860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 8616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMaxHeight()); 8626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMinHeight()); 863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting max/min lines should cause getMaxHeight/getMinHeight to return -1 8656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxLines(2); 8666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting maxLines should return -1 fir maxHeight", 8676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMaxHeight()); 8686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 8696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinLines(1); 8706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting minLines should return -1 for minHeight", 8716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMinHeight()); 8726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 8736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 874a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 8754b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testWidth() throws Throwable { 8766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = findTextView(R.id.textview_text); 8776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int originalWidth = mTextView.getWidth(); 8786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 8796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newWidth = mTextView.getWidth() / 8; 8806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 8816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 8826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 8836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Min Width 8866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 8876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(newWidth); 888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 8896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 8906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth - 1); 8949c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 8956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 8966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Width 8996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 9006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 9036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 9046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 9076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 9089c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 9096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 9106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 9116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 9126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting ems should cause getMaxWidth/getMinWidth to return -1 9146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setEms(1); 9156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMaxWidth()); 9166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMinWidth()); 917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 919a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9204b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMinEms() throws Throwable { 921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9239c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu 9246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 9256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms + 1); 928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 92998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 93098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms - 1); 933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 93498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 93598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 9366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(1); 9386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMinEms()); 939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 941a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9424b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMaxEms() throws Throwable { 943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 9476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms + 1); 950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 95298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 95398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms - 1); 956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 9576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 95898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 95998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 9606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxWidth(originalWidth); 9626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMaxEms()); 963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 965a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9664b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetEms() throws Throwable { 967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("check height", 1, mTextView.getLineCount()); 9696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 9706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms + 1); 973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 97598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 97698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 97798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 97898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms - 1); 981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((1 < mTextView.getLineCount())); 9826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 98398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 98498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 98598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 98698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 989a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9904b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLineSpacing() throws Throwable { 9919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 9929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLineHeight = mTextView.getLineHeight(); 994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float add = 1.2f; 997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float mult = 1.4f; 998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 99992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 0.0f; 1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 100392e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // abnormal 1006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 100992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = -1.4f; 1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 101392e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 1.2f; 1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 0.0f; 1016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 101792e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // edge 1020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MIN_VALUE; 1021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MIN_VALUE; 1022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1023ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1024ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette 1025ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // edge case where the behavior of Math.round() deviates from 1026ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // FastMath.round(), requiring us to use an explicit 0 value 1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MAX_VALUE; 1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MAX_VALUE; 1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1030ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(0, mTextView.getLineHeight()); 1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1033a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10344b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetElegantLineHeight() throws Throwable { 1035ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView = findTextView(R.id.textview_text); 1036ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 10379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 10386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 10396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 10406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 1041ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 1042ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1043ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1044ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien int oldHeight = mTextView.getHeight(); 10459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(true)); 1046ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1047ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1048ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getPaint().isElegantTextHeight()); 1049ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() > oldHeight); 1050ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 10519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(false)); 1052ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1053ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 1054ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() == oldHeight); 1055ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 1056ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1057a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFreezesText() throws Throwable { 1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_hint_linksclickable_freezestext); 1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_true); 1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(false); 1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = "Hello, TextView."; 10749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 1076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final URLSpan urlSpan = new URLSpan("ctstest://TextView/test"); 107872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1079a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov ActivityMonitor am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 10836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 10846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 10856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT); 1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(newActivity); 1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1091a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is removed. 1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 109472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 109572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(text.toString(), mTextView.getText().toString()); 1096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(true); 1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 110272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1103a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 11086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 11096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 111207b9d3406e116f2f6b92932925783eed79503de0Mist Liao Activity oldActivity = newActivity; 111307b9d3406e116f2f6b92932925783eed79503de0Mist Liao while (true) { 111407b9d3406e116f2f6b92932925783eed79503de0Mist Liao newActivity = am.waitForActivityWithTimeout(TIMEOUT); 111507b9d3406e116f2f6b92932925783eed79503de0Mist Liao assertNotNull(newActivity); 111607b9d3406e116f2f6b92932925783eed79503de0Mist Liao if (newActivity != oldActivity) { 111707b9d3406e116f2f6b92932925783eed79503de0Mist Liao break; 111807b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 111907b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1121a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is still there. 1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.toString(), mTextView.getText().toString()); 1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1128a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEditableFactory() { 1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 113398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Editable.Factory mockEditableFactory = spy(new Editable.Factory()); 113498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockEditableFactory).newEditable(any(CharSequence.class)); 113598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setEditableFactory(mockEditableFactory); 113698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 113898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 114098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 114298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 114498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 114698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 114898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 115098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(DigitsKeyListener.getInstance()); 115398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 115598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEditableFactory(null); 1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1165a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSpannableFactory() { 1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 117098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Spannable.Factory mockSpannableFactory = spy(new Spannable.Factory()); 117198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockSpannableFactory).newSpannable(any(CharSequence.class)); 117298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setSpannableFactory(mockSpannableFactory); 117398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 117598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 117798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 117998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 118198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 118398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 118598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 118798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 119098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 119298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSpannableFactory(null); 1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1202a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextChangedListener() { 1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher0 = new MockTextWatcher(); 1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher1 = new MockTextWatcher(); 1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher0); 1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher1); 1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called though the strings are same 1224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called twice (The text is not 1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Editable, so in Append() it calls setText() first) 1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("and appended"); 1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Methods are not called if the string does not change 1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(""); 1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledBeforeTextChanged()); 1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledOnTextChanged()); 1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledAfterTextChanged()); 1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.removeTextChangedListener(watcher1); 1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1268a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetTextKeepState1() { 1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1); 1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, 4); 1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getSelectionEnd()); 1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1); 1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1318a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetEditableText() { 1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "Hello"; 1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.EDITABLE); 1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getEditableText().toString()); 1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.SPANNABLE); 1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.EDITABLE); 1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getEditableText().toString()); 1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.SPANNABLE); 1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1345a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText2() { 1347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = "This is a test for setting text content by char array"; 1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su char[] input = string.toCharArray(); 1349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, input.length); 1352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string, tv.getText().toString()); 1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, 5); 1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string.substring(0, 5), tv.getText().toString()); 1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, -1, input.length); 1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the start position is negative!"); 1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, -1); 1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the length is negative!"); 1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, input.length); 1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the end position is out of index!"); 1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, 0); 1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1380a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText1() { 1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), longString.length()); 1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1); 1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length() - 1, mTextView.getSelectionEnd()); 1432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length()); 1444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1480a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText3() { 1482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 1485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 1486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId); 1488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1); 1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1497a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 14989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetTextUpdatesHeightAfterRemovingImageSpan() throws Throwable { 149998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // Height calculation had problems when TextView had width: match_parent 150098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT; 150198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final Spannable text = new SpannableString("some text"); 150298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int spanHeight = 100; 150398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 150498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // prepare TextView, width: MATCH_PARENT 15059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 15069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 15079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 15089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2); 15099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setPadding(0, 0, 0, 0); 15109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setIncludeFontPadding(false); 15119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 151298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 151398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth, 151498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 15159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 151698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.setLayoutParams(layoutParams); 15179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 1518a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 151998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 152098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height of text with no span 15219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithoutSpan = mTextView.getHeight(); 152298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be smaller than span height", 152398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan < spanHeight); 152498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 152598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // add ImageSpan to text 152698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery); 152798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir drawable.setBounds(0, 0, spanHeight, spanHeight); 152898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ImageSpan span = new ImageSpan(drawable); 152998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 15309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 153198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 153298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 153398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height with span 15349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithSpan = mTextView.getHeight(); 153598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be greater or equal than span height", 153698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithSpan >= spanHeight); 153798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 153898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // remove the span 153998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.removeSpan(span); 15409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 154198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 154298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 15439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightAfterRemoveSpan = mTextView.getHeight(); 154498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertEquals("Text height should be same after removing the span", 154598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan, heightAfterRemoveSpan); 154698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 154798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 1548a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 15494b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRemoveSelectionWithSelectionHandles() throws Throwable { 15506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1551af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1552354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isTextSelectable()); 15539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 1554354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setTextIsSelectable(true); 1555354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setText("abcd", BufferType.EDITABLE); 1556af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1557af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1558354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isTextSelectable()); 1559af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1560af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Long click on the text selects all text and shows selection handlers. The view has an 1561af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // attribute layout_width="wrap_content", so clicked location (the center of the view) 1562af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // should be on the text. 15639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 1564af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 15659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) mTextView.getText())); 1566af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1567354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 1568354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", mTextView.getText())); 1569af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1570af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1571a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 15724b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_insert() throws Throwable { 15736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 15745b51f77b99861d48fec1c327252416f726b3b01aJames Cook 15755b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text. 1576b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 15779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 15786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The cursor is at the end of the text. 15796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 15806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 15816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the typed string in one step. 15826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 15836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 15846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 15856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 15866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo restores the text and cursor position. 15876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 15886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 15896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 15906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 15916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo clears the text again. 15926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 15936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 15946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 15956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo when the undo stack is empty does nothing. 15966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 15976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 15985b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 15995b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 160028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 16015b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1602a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16034b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_delete() throws Throwable { 16046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 16055b51f77b99861d48fec1c327252416f726b3b01aJames Cook 160628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Simulate deleting text and undoing it. 1607b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1608b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1609b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 16109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 16116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The text was actually deleted. 16126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 16136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 16146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo restores the typed string and cursor position in one step. 16166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 16176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 16186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 16196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo removes the text in one step. 16216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 16226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 16236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 16246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo restores the text again. 16266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 16276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 16286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 16296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing again undoes the original typing. 16316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 16326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 16336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 16345b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 16355b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 163628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 16375b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1638c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Initialize the text view for simulated IME typing. Must be called on UI thread. 1639c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private InputConnection initTextViewForSimulatedIme() { 1640c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView = findTextView(R.id.textview_text); 164118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return initTextViewForSimulatedIme(mTextView); 164218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 164318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 164418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir private InputConnection initTextViewForSimulatedIme(TextView textView) { 164518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 164618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setText("", BufferType.EDITABLE); 164718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return textView.onCreateInputConnection(new EditorInfo()); 1648c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1649c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1650c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulates IME composing text behavior. 1651c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private void setComposingTextInBatch(InputConnection input, CharSequence text) { 1652c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1653c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText(text, 1); // Leave cursor at end. 1654c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1655c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1656c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1657c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1658a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1659c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertLatin() { 1660c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1661c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1662c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words, 1663c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // such as "c" -> "ca" -> "cat" -> "cat ". 1664c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "c"); 1665c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "ca"); 1666c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1667c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The completion and space are added in the same batch. 1668c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1669c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("cat", 1); 1670c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText(" ", 1); 1671c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1672c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1673c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements undo in a single step. 1674c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1675c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1676c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1677c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1678c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1679a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1680c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertJapanese() { 1681c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1682c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1683c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji. 1684c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1685c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String NA = "\u306A"; // HIRAGANA LETTER NA 1686c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1687c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1688c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1689c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + NA); 1690c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1691c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The result may be a surrogate pair. The composition ends in the same batch. 1692c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1693c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("\uD83C\uDF37", 1); // U+1F337 TULIP 1694c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText("", 1); 1695c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1696c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1697c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements are a single undo step. 1698c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1699c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1700c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1701c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1702c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1703a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 170471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeInsertAndDeleteLatin() { 170571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi InputConnection input = initTextViewForSimulatedIme(); 170671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 170771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 170871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 170971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 171071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "test"); 171171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 171271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 171371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 171471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 171571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 171671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.setComposingText("", 1); 171771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.finishComposingText(); 171871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 171971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 172071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 172171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("test", mTextView.getText().toString()); 172271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 172371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 172471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 172571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 172671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1727a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 172871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeAutoCorrection() { 172918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 173018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 173118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 173271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 173371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Start typing a composition. 173471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 173571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 173671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "teh"); 173771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 173818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CorrectionInfo correctionInfo = new CorrectionInfo(0, "teh", "the"); 173918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 174071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 174171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Auto correct "teh" to "the". 174218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCorrection(correctionInfo)); 174371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.commitText("the", 1); 174471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 174571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 174618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCorrection(refEq(correctionInfo)); 174718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 174818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("the", spiedTextView.getText().toString()); 174918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 175018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("teh", spiedTextView.getText().toString()); 175118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 175218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 175318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 175418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 175518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir @UiThreadTest 1756a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 175718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir public void testUndo_imeAutoCompletion() { 175818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 175918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 176018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 176118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 176218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Start typing a composition. 176318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "a"); 176418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "an"); 176518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "and"); 176618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 176718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CompletionInfo completionInfo = new CompletionInfo(0, 0, "android"); 176818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 176918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.beginBatchEdit(); 177018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Auto complete "and" to "android". 177118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCompletion(completionInfo)); 177218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.commitText("android", 1); 177318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.endBatchEdit(); 177418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 177518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCompletion(refEq(completionInfo)); 177618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 177718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("android", spiedTextView.getText().toString()); 177818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 177918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 178071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 178171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 178271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1783a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1784c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeCancel() { 1785c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1786c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1787c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1788c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Start typing a composition. 1789c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1790c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1791c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1792c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1793c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1794c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Cancel the composition. 1795c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, ""); 1796c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1797c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 179871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals(HA + "n" + "flower", mTextView.getText().toString()); 1799c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1800c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1801c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1802c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1803c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1804a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1805c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeEmptyBatch() { 1806c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1807c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1808c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1809c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Send an empty batch edit. This happens if the IME is hidden and shown. 1810c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1811c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1812c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1813c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1814c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1815c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1816c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1817c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1818c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1819c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1820a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 18214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_setText() throws Throwable { 18226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 182328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1824c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Create two undo operations, an insert and a delete. 1825b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1826b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1827b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 18289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 18296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears both undo operations, so undo doesn't happen. 18306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 18316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 18326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 18336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 18346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Clearing text programmatically does not undo either. 18356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 18366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 18376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1838277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1839277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1840277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 184128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1842a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 18434b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRedo_setText() throws Throwable { 18446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1845277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1846277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. This creates an undo entry. 1847b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 18489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 18496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing to create a redo entry. 18506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 1851277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 18526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears the redo stack, so redo doesn't happen. 18536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 18546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 18556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 1856277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1857277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1858277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1859277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1860a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 18614b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directAppend() throws Throwable { 18626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 186328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1864277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1865b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 18669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 18676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. 18686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("def"); 18696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abcdef", mTextView.getText().toString()); 1870277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 18716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the append as a separate step. 18726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 18736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 1874277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 18756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 18766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 18776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1878277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1879277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1880277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1881277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1882a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 18834b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directInsert() throws Throwable { 18846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1885277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1886277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1887b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 18889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 18896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Directly modify the underlying Editable to insert some text. 18906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // NOTE: This is a violation of the API of getText() which specifies that the 18916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // returned object should not be modified. However, some apps do this anyway and 18926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // the framework needs to handle it. 18936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Editable text = (Editable) mTextView.getText(); 18946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu text.insert(0, "def"); 18956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("defabc", mTextView.getText().toString()); 18966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 18976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the insert as a separate step. 18986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 18996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 19006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 19016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 19026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1904277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1905277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1906277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1907277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 1909a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1910c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void testUndo_noCursor() { 1911c530472a02205f0b7d87f9f06140c56ca0849816James Cook initTextViewForTyping(); 1912c530472a02205f0b7d87f9f06140c56ca0849816James Cook 19136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Append some text to create an undo operation. There is no cursor present. 19146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("cat"); 1915c530472a02205f0b7d87f9f06140c56ca0849816James Cook 19166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Place the cursor at the end of the text so the undo will have to change it. 19176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 3); 1918c530472a02205f0b7d87f9f06140c56ca0849816James Cook 19196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the append. This should not crash, despite not having a valid cursor 19206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // position in the undo operation. 19216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 1922c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 1923c530472a02205f0b7d87f9f06140c56ca0849816James Cook 1924a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19254b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_textWatcher() throws Throwable { 19266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1927277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1928277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Add a TextWatcher that converts the text to spaces on each change. 1929277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 1930277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1931277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1932b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // TextWatcher altered the text. 19356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 1936277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 19386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1940277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1941277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1942c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 1943c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 19446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 1945a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1946c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void testUndo_textWatcherDirectAppend() { 1947c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook initTextViewForTyping(); 1948c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 1949c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Add a TextWatcher that converts the text to spaces on each change. 1950c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 1951c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 19526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. The TextWatcher changes it to spaces. 19536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("abc"); 19546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 1955c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 19566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 19576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 195928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 196028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1961a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19624b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_shortcuts() throws Throwable { 19636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 196428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 196528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Type some text. 1966b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Z triggers undo. 19696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0, 19706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 19716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control)); 19726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 19736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 19746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Shift-Z triggers redo. 19756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 19766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON); 19776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift)); 19786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 19795b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 19805b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 19815b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 19825b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1983a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19844b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceState() throws Throwable { 19856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 19865b51f77b99861d48fec1c327252416f726b3b01aJames Cook 19875b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text to create an undo operation. 1988b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the TextView. 19916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 19926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 19935b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 19945b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 19955b51f77b99861d48fec1c327252416f726b3b01aJames Cook 19965b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Delete a character to create a new undo operation. 1997b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 19989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ab", mTextView.getText().toString()); 20005b51f77b99861d48fec1c327252416f726b3b01aJames Cook 20016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the delete. 20026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20045b51f77b99861d48fec1c327252416f726b3b01aJames Cook 20056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing, which verifies that the original undo operation was parceled 20066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // correctly. 20076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 20095f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 20106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the undo stack (which is empty but has been used and may 20116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // contain other state). 20126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 20136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 20145f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 20155f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 20165f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 20175f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 2018a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20194b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceStateEmpty() throws Throwable { 20206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 20215f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 20225f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Type and delete to create two new undo operations. 2023b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2024b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 20259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Empty the undo stack then parcel and unparcel the TextView. While the undo 20276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // stack contains no operations it may contain other state. 20286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 20316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 20325f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 20335f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 20345f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 20355f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Create two more undo operations. 2036b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2037b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 20389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Verify undo still works. 20406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("b", mTextView.getText().toString()); 20426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 20445b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 20455b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 20465b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 20475b51f77b99861d48fec1c327252416f726b3b01aJames Cook 20486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2049a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2050b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCopyAndPaste() { 2051b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 20526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 20546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 20556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Copy "bc". 20576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 20586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 20596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "bc" between "b" and "c". 20616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 20626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 20636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abbccd", mTextView.getText().toString()); 20646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select entire text and paste "bc". 20666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 20676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 20686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bc", mTextView.getText().toString()); 2069b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2070b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2071a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20724b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCopyAndPaste_byKey() throws Throwable { 20736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 207449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 207549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2076b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 20796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 208049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 208149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 208249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Copy "bc" 2083b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_COPY); 208449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 20859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set cursor between 'b' and 'c'. 20876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 208849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 208949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 209049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2091b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 209249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("abbcc", mTextView.getText().toString()); 209349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 20949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 20966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 20976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON); 20986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + copy doesn't perform copy. 20996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 21006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 21016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcabbcc", mTextView.getText().toString()); 21036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 21056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 21066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 21076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + copy doesn't perform copy. 21086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 21096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 21106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcabbcc", mTextView.getText().toString()); 21126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 21146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 21156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 21166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + copy doesn't perform copy. 21176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 21186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 21196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcbcabbcc", mTextView.getText().toString()); 212149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 21228e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 212349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 212449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 21256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2126a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2127b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste() { 2128b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 21296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 21316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 21326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "bc". 21346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 21356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 21366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 21376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "ad". 21396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 2); 21406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 21416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "ad". 21446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 2146b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2147b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2148a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21494b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCutAndPaste_byKey() throws Throwable { 21506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 215149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 215249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2153b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 21549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 21566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 215749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 215849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 215949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Cut "bc" 2160b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_CUT); 216149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 21629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("a", mTextView.getText().toString()); 21646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Move cursor to the head 21656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 216649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 216749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 216849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2169b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 217049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 217149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 21724b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 21736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 21746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 21756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON); 21766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + cut doesn't perform cut. 21776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 21786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 21796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 21816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 21826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + cut doesn't perform cut. 21836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 21846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 21856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 21876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 21886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + cut doesn't perform cut. 21896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 21906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 219149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 21922de5a65a1540ec0b1ed03ec75c49ff9c242331baSiyamed Sinir mInstrumentation.waitForIdleSync(); 219349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 219449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 2195b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) { 2196b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable)textView.getText(); 2197b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final int at = spannable.length() / 2; 2198b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi return spannable.getSpans(at, at, type).length > 0; 2199b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2200b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 22016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2202a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2203b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste_withAndWithoutStyle() { 2204b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 22056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("example", BufferType.EDITABLE); 22076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 22086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set URLSpan. 22106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Spannable spannable = (Spannable) mTextView.getText(); 22116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0); 22126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 22136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut entire text. 22156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 22186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste without style. 22206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText); 22216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 22226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text doesn't have URLSpan. 22236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 22246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste with style. 22266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 22296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text has URLSpan. 22306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2231b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2232b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2234a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 22354ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien public void testSaveInstanceState() { 2236baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // should save text when freezesText=true 22374ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView originalTextView = new TextView(mActivity); 22384ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 22394ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setText(text); 22404ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setFreezesText(true); // needed to actually save state 22414ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien Parcelable state = originalTextView.onSaveInstanceState(); 22424ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 22434ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView restoredTextView = new TextView(mActivity); 22444ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien restoredTextView.onRestoreInstanceState(state); 22454ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien assertEquals(text, restoredTextView.getText().toString()); 22464ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 22474ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 22484ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2249a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2250baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_whenFreezesTextIsFalse() { 22514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 2252baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text when freezesText=false 2253baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2254baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2255baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2256baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 22574ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 2258baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2259baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2260baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2261baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2262baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2263baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2264baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2265baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2266baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2267baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text even when textIsSelectable=true 2268baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2269baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2270baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2271baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2272baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2273baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2274baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2275baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2276baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2277baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2278baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2279baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2280baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2281baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2282baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2283baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2284baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2285baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2286baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2287a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2288baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() { 2289baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2290baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2291baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2292baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2293baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2294baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2295baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2296baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2297baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2298baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2299baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2300baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2301baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionStart()); 2302baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionEnd()); 2303baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2304baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2305baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2306baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2307a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2308baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() { 2309baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2310baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2311baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2312baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2313baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2314baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2315baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2316baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2317baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2318baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2319baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2320baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2321baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2322baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2323baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2324baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2325baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir //when textIsSelectable, selection start and end are initialized to 0 2326baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionStart()); 2327baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionEnd()); 2328baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2329baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2330baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2331baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2332a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2333baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_savesSelectionWhenExists() { 2334baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2335baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2336baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2337baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2338baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2339baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2340baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2341baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2342baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2343baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2344baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2345baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2346baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2347baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2348baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2349baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart()); 2350baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd()); 23514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 23524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2354a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText() { 2356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 2357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 2359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 2360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.EDITABLE); 2362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 2364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.SPANNABLE); 2366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 2368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1, BufferType.EDITABLE); 2371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 2372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2377a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHint() { 2379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 2380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHint()); 2383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_blank); 2385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getHint()); 2386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_string); 2388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint), 2389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_resid); 2392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hint), 2393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint("This is hint"); 2396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("This is hint", mTextView.getHint().toString()); 2397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(R.string.text_view_hello); 2399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 2400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint().toString()); 2401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Non-exist resid 2403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(-1); 2405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if id is illegal"); 2406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2410a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 24114b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessError() throws Throwable { 2412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 241553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner final String errorText = "Oops! There is an error"; 2416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 24179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null)); 2418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2421a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable icon = TestUtils.getDrawable(mActivity, R.drawable.failed); 24229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(errorText, icon)); 2423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // can not check whether the drawable is set correctly 2426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 24279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null, null)); 2428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 24319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 24326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance("")); 24336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 24346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 24356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2441b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event that will not change the TextView's text 2443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getText().toString()); 2444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // The icon and error message will not be reset to null 244553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner assertEquals(errorText, mTextView.getError().toString()); 2446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 24479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 24486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance()); 24496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 24506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 24516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2452300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu }); 2453300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mInstrumentation.waitForIdleSync(); 2454300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu 2455b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "1"); 2456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event cause changes to the TextView's text 2457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("1", mTextView.getText().toString()); 2458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the error message and icon will be cleared. 2459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2462a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 24634b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessFilters() throws Throwable { 2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final InputFilter[] expected = { new InputFilter.AllCaps(), 2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new InputFilter.LengthFilter(2) }; 2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 24699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 24706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 24716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 24726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 24736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFilters(expected); 24746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(expected, mTextView.getFilters()); 2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2480b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("A", mTextView.getText().toString()); 2483b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2486b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "c"); 2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 'C' could not be accepted, because there is a length filter. 2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(null); 2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw IllegalArgumentException!"); 2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IllegalArgumentException e) { 2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2497a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 24984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetFocusedRect() throws Throwable { 2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2501fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Basic 25029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 25039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2510fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Single line 2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 251988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 252088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 25216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 252288b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 3, 13); 2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 2527fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien /* Cursor coordinates from getPrimaryHorizontal() may have a fractional 2528fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * component, while the result of getFocusedRect is in int coordinates. 2529fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * It's not practical for these to match exactly, so we compare that the 2530fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * integer components match - there can be a fractional pixel 2531fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * discrepancy, which should be okay for all practical applications. */ 2532fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left); 2533fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right); 2534fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2535fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2536fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 25379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 253888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 253988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 25406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 254188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 13, 3); 2542fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2543fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2544fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2545fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2546fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left); 2547fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right); 2548fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2549fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2550fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2551fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Multi lines 2552fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView = findTextView(R.id.textview_text_two_lines); 2553fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2554fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX(), rc.left); 2555fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2556fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY(), rc.top); 2557fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2558fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 25599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 256088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 256188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 25626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 256388b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 4); 2564fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2565fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2566fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2567fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2568fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left); 2569fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right); 2570fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2571fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2572fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 25739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 257488b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 257588b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 25766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 257788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir // cross the "\n" and two lines 257888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 10); 2579fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2580fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2581fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2582fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Path path = new Path(); 2583fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getLayout().getSelectionPath(2, 10, path); 2584fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio RectF rcf = new RectF(); 2585fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio path.computeBounds(rcf, true); 2586fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2587a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.left - 1, (float) rc.left, 0.0f); 2588a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.right + 1, (float) rc.right, 0.0f); 2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2590fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom); 2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Exception 2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(null); 2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2600a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetLineCount() throws Throwable { 26029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 26039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // this is an one line text with default setting. 2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multi-lines 2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(mTextView.getWidth() / 3); 2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it to an one line 2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(Integer.MAX_VALUE); 2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set min lines don't effect the lines count for actual text. 2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(12); 2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the internal Layout has not been built. 2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLayout()); 2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineCount()); 2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2626a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLineBounds() throws Throwable { 2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 26299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, null)); 2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, rc)); 2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.right); 2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.bottom); 2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null)); 2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth(), rc.right); 2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight(), rc.bottom); 2647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 26496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 26506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingLeft(), rc.left); 2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right); 2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingTop(), rc.top); 2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom); 2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2659fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2660a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26614b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetBaseLine() throws Throwable { 26629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getBaseline()); 2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline()); 2668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 26706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 26716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0); 2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getBaseline()); 2676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2678a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testPressKey() throws Throwable { 26806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2682b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2684b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("ab", mTextView.getText().toString()); 2686b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 2687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2690a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2691aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky public void testKeyNavigation() throws Throwable { 2692aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky initTextViewForTypingOnUiThread(); 2693aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivityRule.runOnUiThread(() -> { 2694aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_singleLine).setFocusableInTouchMode(true); 2695aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_text_two_lines).setFocusableInTouchMode(true); 2696aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 2697aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setText("abc"); 2698aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setFocusableInTouchMode(true); 2699aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky }); 2700aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2701aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.requestFocus(); 2702aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2703aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2704aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2705aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Arrows should not cause focus to leave the textfield 2706aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP); 2707aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2708aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2709aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2710aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_DOWN); 2711aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2712aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2713aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2714aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Tab should 2715aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_TAB); 2716aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2717aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertFalse(mTextView.isFocused()); 2718aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky } 2719aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2720aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky @Test 27214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetIncludeFontPadding() throws Throwable { 2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2723ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getIncludeFontPadding()); 27249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 27266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int oldHeight = mTextView.getHeight(); 27329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setIncludeFontPadding(false)); 2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() < oldHeight); 2736ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getIncludeFontPadding()); 2737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2740a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testScroll() { 2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //don't set the Scroller, nothing changed. 2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the Scroller 2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Scroller s = new Scroller(mActivity); 2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(s); 2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.startScroll(0, 0, 320, 480, 0); 2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.abortAnimation(); 2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.forceFinished(false); 2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setScroller(s); 2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, mTextView.getScrollX()); 2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, mTextView.getScrollY()); 2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2765a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDebug() throws Throwable { 27679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 27699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.debug(0); 27709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("Hello!"); 27719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 27729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(mTextView); 2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(1); 2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2779a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSelection() throws Throwable { 2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "This is the content"; 2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.selectAll((Spannable) mTextView.getText()); 2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.length(), mTextView.getSelectionEnd()); 2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionStart = 5; 2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionEnd = 7; 2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart); 2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionEnd()); 2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); 2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, mTextView.getSelectionEnd()); 2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2804a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testOnSelectionChangedIsTriggeredWhenSelectionChanges() throws Throwable { 28066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String text = "any text"; 28079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 28089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 28099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 28106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 28116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // assert that there is currently no selection 28129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(mTextView.hasSelection()); 28136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 28146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // select all 28159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 2816b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // After selectAll OnSelectionChanged should have been called 28179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(0, text.length()); 28186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 28199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 28206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // change selection 28219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 5); 28229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(1, 5); 28236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 28249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 28256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // clear selection 28269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.removeSelection((Spannable) mTextView.getText()); 28279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(-1, -1); 28286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 28296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2831a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessEllipsize() { 2833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_ellipsize); 2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_default); 2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_none); 2839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_start); 2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.START, mTextView.getEllipsize()); 2843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_middle); 2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize()); 2846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_end); 2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.END, mTextView.getEllipsize()); 2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); 2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize()); 2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.END); 2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize()); 2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(null); 2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(10); 2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord"); 2865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.invalidate(); 2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no method to check if '...yLongVeryLongWord' is painted in the screen. 2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2871a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 287292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForSingleLine() throws Throwable { 287392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline or ellipsize set, single line text 287492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 287592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 287692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a"); 287792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 287892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with two lines 287992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 288092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(1); 288192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 288292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na"); 288392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 288492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with two lines 288592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 288692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 288792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(1); 288892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 288992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na"); 28902deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 289192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 289292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 289392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 289492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 289592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 289692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 289792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 289892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 289992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 290092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 290192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 290292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 29039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 29042deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 290592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 290692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 290792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 290892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 290992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 291092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(0)); 291192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 291292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 291392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(0)); 291492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 291592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 291692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir @Test 291792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForMultiLine() throws Throwable { 291892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, text with two lines 291992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 292092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 292192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a\na"); 292292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 292392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with three lines 292492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 292592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 292692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 292792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na\na"); 292892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 292992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with three lines 293092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 293192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 293292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 293392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 293492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na\na"); 29356031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 29362deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 29372deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 293892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 293992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 29402deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 294192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 294292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 294392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 294492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 294592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 294692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 294792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 294892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 2949a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 29502deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 295192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 295292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 295392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 295492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 295592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) { 295692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 295792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 295892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(i)); 295992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 296092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 296192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 296292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(i)); 296392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 29642deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 29652deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 2966a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 296792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForHint() throws Throwable { 296892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with two lines 296992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvTwoLines = new TextView(mActivity); 297092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setLineSpacing(0, 1.5f); 297192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setHint("a\na"); 29722deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 297392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with three lines 297492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvThreeLines = new TextView(mActivity); 297592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setLineSpacing(0, 1.5f); 297692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setHint("a\na\na"); 297792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 297892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, hint with three lines 297992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 298092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 298192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 298292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 298392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setHint("a\na\na"); 29842deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 298592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, hint with three lines 298692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 298792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 298892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 298992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setHint("a\na\na"); 29906031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 29912deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 29922deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 299392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 299492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 29952deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 299692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvTwoLines, layoutParams); 299792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 299892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 299992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvThreeLines, layoutParams); 30002deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 300192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 300292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 300392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 300492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3005a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 30062deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 300792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Non-ellipsized hint should not crop text at maxLines", 300892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.getHeight(), tvEllipsizeNone.getHeight()); 300992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 301092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Ellipsized hint should crop text at maxLines", 301192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.getHeight(), tvEllipsizeEnd.getHeight()); 30122deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 30132deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 30149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3015a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3016354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void testAccessCursorVisible() { 3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(true); 3020354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isCursorVisible()); 3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(false); 3022354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isCursorVisible()); 3023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3026a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPerformLongClick() { 3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("This is content"); 3030938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3031938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnLongClickListener mockOnLongClickListener = mock(View.OnLongClickListener.class); 3032938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.TRUE); 3033938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3034938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnCreateContextMenuListener mockOnCreateContextMenuListener = 3035938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mock(View.OnCreateContextMenuListener.class); 30364e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov doAnswer((InvocationOnMock invocation) -> { 30374e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov ((ContextMenu) invocation.getArguments() [0]).add("menu item"); 30384e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov return null; 3039938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov }).when(mockOnCreateContextMenuListener).onCreateContextMenu( 3040938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class)); 3041938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3042938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnLongClickListener(mockOnLongClickListener); 3043938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener); 3044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3045938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3046938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyZeroInteractions(mockOnCreateContextMenuListener); 3047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3048938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnLongClickListener); 3049938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.FALSE); 3050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3051938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3052938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 3053938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class)); 3054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3055938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnCreateContextMenuListener); 3056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setOnLongClickListener(null); 3057938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu( 3058938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class)); 3059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.performLongClick()); 3060938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyNoMoreInteractions(mockOnLongClickListener); 3061938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 3062938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class)); 3063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3066a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextAttr() { 3068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_textAttr); 3069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getText 3070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString()); 3071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getCurrentTextColor 3073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHintTextColors().getDefaultColor()); 3079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextScaleX 3083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f); 3084fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextScaleX 3086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(2.4f); 3087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f); 3088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(0f); 3090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0f, mTextView.getTextScaleX(), 0.01f); 3091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(- 2.4f); 3093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f); 3094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextSize 3096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 3097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTypeface 3099119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson // getTypeface will be null if android:typeface is set to normal, 3100c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // and android:style is not set or is set to normal, and 3101c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // android:fontFamily is not set 3102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT); 3105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.DEFAULT, mTextView.getTypeface()); 3106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face 3107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null); 3108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // default type face, bold style, note: the type face will be changed 3111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // after call set method 3112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); 3113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face, BOLD style 3116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null, Typeface.BOLD); 3117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // old type face, null style 3120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, 0); 3121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3125a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAppend() { 3127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1: check the original length, should be blank as initialised. 3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getText().length()); 3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 2: append a string use append(CharSquence) into the original blank 3133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was 3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // not already editable. 3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getText() instanceof Editable); 3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append."); 3137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.", mTextView.getText().toString()); 3138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 3: append a string from 0~3. 3141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 3); 3142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 4: append a string from 0~0, nothing will be append as expected. 3146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 0); 3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 5: append a string from -3~3. check the wrong left edge. 3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", -3, 3); 3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 6: append a string from 3~10. check the wrong right edge. 3158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 3, 10); 3160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 7: append a null string. 3165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(null); 3167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException"); 3168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 3169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3172f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3174f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() { 3175f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3176f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3177f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3178f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3179f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" another text without URL"); 3180f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3181f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3182f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3183f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3184f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL another text without URL", text.toString()); 3185f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3186f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3187f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3188a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3189f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() { 3190f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3191f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3192f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3193f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3194f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3195f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3196f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3197f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3198f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3199f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3200f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3201f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3202a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3203f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenAutoLinkIsEnabled() { 3204f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3205f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3206f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3207f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3208f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3209f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3210f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3211f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3212f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3213f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3214f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3215f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3216f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3217f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3218f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3219a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3220f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() { 3221f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3222f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3223f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with URL http://android.com/before"); 3224f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3225f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3226f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3227f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3228f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3229f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length); 3230f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("First URLSpan URL should be same", 3231f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/before"); 3232f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3233f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[1].getURL(), "http://android.com"); 3234f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text with URL http://android.com/before text with URL http://android.com", 3235f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir text.toString()); 3236f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3237f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3238f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3239a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3240f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() { 3241f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3242f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3243f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3244f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3245f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with a url: http://android.com"); 3246f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3247f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertNotNull("MovementMethod should not be null when text contains url", 3248f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod()); 3249f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url", 3250f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod() instanceof LinkMovementMethod); 3251f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3252f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3253f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3254a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3255f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() { 3256f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3257f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3258f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3259f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3260f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(new SpannableString(" text with a url: http://android.com")); 3261f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3262f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3263f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3264f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3265f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3266f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3267f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3268f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3269f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3270a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3271f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() { 3272f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3273f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3274f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a partial url android."); 3275f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3276f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("com"); 3277f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3278f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3279f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3280f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending to partial URL", 3281f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 1, urlSpans.length); 3282f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3283f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3284f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3285f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3286f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3287a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3288f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() { 3289f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3290f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3291f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a url http://android.com"); 3292f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3293f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("/textview"); 3294f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3295f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3296f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3297f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length); 3298f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the new URL", 3299f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/textview"); 3300f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3301f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 33029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3303a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 33046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetLetterSpacing_returnsValueThatWasSet() { 33056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 33066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLetterSpacing(2f); 33076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getLetterSpacing should return the value that was set", 3308a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 2f, mTextView.getLetterSpacing(), 0.0f); 33096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 33106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3311a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 33129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetLetterSpacingChangesTextWidth() throws Throwable { 33139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 33149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 33159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("aa"); 33169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLetterSpacing(0f); 33179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 33189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 33199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 33206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 33226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 33236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 33246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 33259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 33266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 33276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3329a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 33306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with zero letter spacing 33329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float zeroSpacing = mTextView.getLayout().getLineWidth(0); 33336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(1f)); 3335a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 33366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with single letter spacing 33389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float singleSpacing = mTextView.getLayout().getLineWidth(0); 33396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(2f)); 3341a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 33426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with double letter spacing 33449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float doubleSpacing = mTextView.getLayout().getLineWidth(0); 33456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Double spacing should have two times the spacing of single spacing", 33476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir doubleSpacing - zeroSpacing, 2f * (singleSpacing - zeroSpacing), 1f); 33486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 33496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 33509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3351a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 33526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetFontFeatureSettings_returnsValueThatWasSet() { 33536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 33546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setFontFeatureSettings("\"smcp\" on"); 33556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getFontFeatureSettings should return the value that was set", 33566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir "\"smcp\" on", mTextView.getFontFeatureSettings()); 33576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 33586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 335977030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @UiThreadTest 336077030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @Test 336177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka public void testSetGetFontVariationSettings() { 336277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView = new TextView(mActivity); 3363a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Context context = InstrumentationRegistry.getTargetContext(); 3364a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Typeface typeface = Typeface.createFromAsset(context.getAssets(), "multiaxis.ttf"); 3365a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setTypeface(typeface); 336677030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3367a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // multiaxis.ttf supports "aaaa", "BBBB", "a b ", " C D" axes. 3368a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3369a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // The default variation settings should be null. 337077030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 337177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3372a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka final String[] nonEffectiveSettings = { 3373a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "invalid syntax", 3374a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaa' 1.0", // tag is not 4 ascii chars 3375a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0", // unsupported tag 3376a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' ' 1.0", // unsupported tag 3377a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'AAAA' 0.7", // unsupported tag (case sensitive) 3378a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' a b' 1.3", // unsupported tag (white space should not be ignored) 3379a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'C D ' 1.3", // unsupported tag (white space should not be ignored) 3380a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0, 'cccc' 2.0", // none of them are supported. 3381a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3382a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3383a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3384a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse("Must return false for " + notEffectiveSetting, 3385a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setFontVariationSettings(notEffectiveSetting)); 3386a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertNull("Must not change settings for " + notEffectiveSetting, 3387a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.getFontVariationSettings()); 3388a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3389a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3390a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka String retainSettings = "'aaaa' 1.0"; 3391a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(retainSettings)); 3392a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3393a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse(mTextView.setFontVariationSettings(notEffectiveSetting)); 3394a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals("Must not change settings for " + notEffectiveSetting, 3395a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka retainSettings, mTextView.getFontVariationSettings()); 3396a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3397a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3398a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // At least one axis is supported, the settings should be applied. 3399a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka final String[] effectiveSettings = { 3400a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0", // supported tag 3401a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'a b ' .7", // supported tag (contains whitespace) 3402a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'BBBB' 0.5", // both are supported 3403a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, ' C D' 0.5", // both are supported 3404a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'bbbb' 0.4", // 'bbbb' is unspported. 3405a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3406a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3407a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String effectiveSetting : effectiveSettings) { 3408a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(effectiveSetting)); 3409a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals(effectiveSetting, mTextView.getFontVariationSettings()); 3410a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 341177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 341277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView.setFontVariationSettings(""); 341377030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 341477030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka } 341577030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3416a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionSingleLineLtr() throws Throwable { 34186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // asserts getOffsetPosition returns correct values for a single line LTR text 34199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final String text = "aaaaa"; 34209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 34219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 34229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 34239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 34249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 34259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 34269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 34276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3429a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 34306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 34319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 34326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 34346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 34356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 34366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 34379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 34386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 34396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34404b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3441023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 34426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int firstOffset = 0; 34446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int lastOffset = text.length() - 1; 34456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int midOffset = text.length() / 2; 34466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view 34486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 34499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float y = mTextView.getHeight() / 2f; 34509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 34516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text 34539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getLayout().getLineWidth(0) - 1f; 34549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset, mTextView.getOffsetForPosition(x, y)); 34556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view 34579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth(); 34589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset + 1, mTextView.getOffsetForPosition(x, y)); 34596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view - out of bounds 34616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = -1f; 34629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 34636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text 34659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = (float) Math.floor(mTextView.getLayout().getLineWidth(0) / 2f + 0.5f); 34669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(midOffset, mTextView.getOffsetForPosition(x, y)); 34676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3469a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineLtr() throws Throwable { 3471023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "aaa\n"; 34726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 34739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 34749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 34759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 34769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 34779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 34789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 34799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 34806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3482a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 34836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 34849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 34856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 34876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 34886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 34896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 34909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 34916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 34926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3494023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 34956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 34979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 34986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 35006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 35016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float y = lineBounds.height() / 2f; 35029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 35036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 35059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 35069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 35099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 35106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2; 35116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 35136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 35149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 35156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 35179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getLayout().getLineWidth(1) - 1f; 35189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 35219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 35229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 35259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = (float) Math.floor(mTextView.getLayout().getLineWidth(1) / 2f + 0.5f); 35266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 35279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 35286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3530a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineRtl() throws Throwable { 3532023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "\u0635\u0635\u0635\n"; 35336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 35349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 35359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 35369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 35379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 35389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 35399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 35409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 35416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3543a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 35446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 35459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 35466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 35489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final LayoutParams layoutParams = new LayoutParams( 35499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.MATCH_PARENT, 35509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.WRAP_CONTENT); 35519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 35526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 35536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35544b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3555023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 35566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 35589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 35596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 35619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float x = mTextView.getWidth() - 1f; 35626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float y = lineBounds.height() / 2f; 35639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 35646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 35666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 35679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 35709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 35716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f; 35726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 35749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 35759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 35766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 35786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 35799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 35829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - mTextView.getLayout().getLineWidth(1) + 1f; 35839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 35846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 35869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - (float) Math.floor( 35879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineWidth(1) / 2f + 0.5f); 35886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 35899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 35906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3593a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsFalseByDefault() { 3595a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 35966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 35976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 35986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3601a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsTrueIfSetTextIsSelectableCalledWithTrue() { 3603a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 36046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 36056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 36066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 36076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 36086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3610a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testSetIsTextSelectable() { 3612a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 36136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 36156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusable()); 36166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusableInTouchMode()); 36176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isClickable()); 36186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isLongClickable()); 36196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 36216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 36236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusable()); 36246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusableInTouchMode()); 36256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isClickable()); 36266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isLongClickable()); 36276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(textView.getMovementMethod()); 36286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 3629f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3630a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36314b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessTransformationMethod() throws Throwable { 3632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the password attribute in xml 3633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_password); 3634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the singleLine attribute in xml 3639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_singleLine); 3640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(SingleLineTransformationMethod.getInstance(), 3642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false, 3645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Capitalize.NONE); 3646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final TransformationMethod method = PasswordTransformationMethod.getInstance(); 3647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change transformation method by function 36489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 36506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTransformationMethod(method); 36516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTransformedText = method.getTransformation(mTextView.getText(), mTextView); 3652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 36536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 3654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3659b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, "H E 2*L O"); 36609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.append(" ")); 3661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3663354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // It will get transformed after a while 3664354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're waiting for transformation to "******" 3665354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(TIMEOUT, () -> mTransformedText.toString() 3666354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .equals("\u2022\u2022\u2022\u2022\u2022\u2022")); 3667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set null 36699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTransformationMethod(null)); 3670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTransformationMethod()); 3672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3675a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testCompound() { 3677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int padding = 3; 3679fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Drawable[] drawables = mTextView.getCompoundDrawables(); 3680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[0]); 3681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[1]); 3682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[2]); 3683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test setCompoundDrawablePadding and getCompoundDrawablePadding 3686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablePadding(padding); 3687fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(padding, mTextView.getCompoundDrawablePadding()); 3688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using resid, 0 represents null 3690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass, 3691fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su R.drawable.failed, 0); 3692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3695a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.start), 3696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[0]).getBitmap()); 3697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3698a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.pass), 3699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[1]).getBitmap()); 3700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3701a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.failed), 3702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[2]).getBitmap()); 3703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3706a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.blue); 3707a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3708a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using drawables directly 3711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null); 3712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(), 3725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(), 3727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(), 3729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set bounds to drawables and set them again. 3733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 1, 2); 3734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 3, 4); 3735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 5, 6); 3736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // usinf drawables 3737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, top, right, null); 3738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(), 3751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(), 3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(), 3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 37596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir @UiThreadTest 3760a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetCompoundDrawablesRelative() { 37626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare textview 37636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 37646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare drawables 3766a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable start = TestUtils.getDrawable(mActivity, R.drawable.blue); 3767a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable end = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3768a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3769a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.black); 37706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(start); 37716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(end); 37726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(top); 37736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(bottom); 37746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir Drawable[] drawables = mTextView.getCompoundDrawablesRelative(); 37766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 37776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 37786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 37796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 37806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 37816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 37826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 37846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 37856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 37866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 37886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 37896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 37906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 37916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 37926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 37936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 37956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 37966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 37976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 37996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 38006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 38016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 38026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 38036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 38046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(null, null, null, null); 38066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 38076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 38096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 38106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 38116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 38126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 38136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 38146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 38156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3816a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 38174b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSingleLine() throws Throwable { 38189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 38199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 38209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 38219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu setSpannableText(mTextView, "This is a really long sentence" 3822013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu + " which can not be placed in one line on the screen."); 3823013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3824013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu // Narrow layout assures that the text will get wrapped. 38256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout innerLayout = new FrameLayout(mActivity); 3826013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 38279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu innerLayout.addView(mTextView); 3828013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3829013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 3830013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu layout.addView(innerLayout); 3831013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 38329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 38336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(layout); 38349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 3835013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu }); 3836013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mInstrumentation.waitForIdleSync(); 3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 38399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 3840da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3841da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineWidth = 0; 3842da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineHeight = 0; 3843da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 38449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 38459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineWidth = mTextView.getLayout().getWidth(); 38469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineHeight = mTextView.getLayout().getHeight(); 3847da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 38499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setSingleLine(false)); 3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 38519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(null, mTextView.getTransformationMethod()); 3852da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 38539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 38549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getHeight() > singleLineHeight); 38559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getWidth() < singleLineWidth); 3856da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // same behaviours as setSingLine(true) 38599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(mTextView::setSingleLine); 3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 38629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 3863da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 38649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 38659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineHeight, mTextView.getLayout().getHeight()); 38669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineWidth, mTextView.getLayout().getWidth()); 3867da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3871a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 387298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMaxLines() { 3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 38746031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) (mTextView.getPaint().measureText(LONG_TEXT) / 4)); 3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT); 3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int maxLines = 2; 3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > maxLines); 3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxLines(maxLines); 3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestLayout(); 3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 388398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2, mTextView.getMaxLines()); 388498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight()); 3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3888636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 3889a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3890636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_frequencyNone() { 3891636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] BREAK_STRATEGIES = { 3892636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY, 3893636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_BALANCED }; 3894636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3895636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 3896636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3897636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int breakStrategy : BREAK_STRATEGIES) { 3898636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 3899636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 39006031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 39016031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 3902636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3903636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 3904636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(breakStrategy); 3905636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3906636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 3907636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3908636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 3909636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 3910636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 3911636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3912636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 3913636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 3914636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 3915636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any break strategy, hyphenation should not happen if 3916636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // HYPHENATION_FREQUENCY_NONE is specified. 3917636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 3918636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 3919636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3920636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3921636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3922636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3923636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3924636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 3925a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3926636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_breakStrategySimple() { 3927636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] HYPHENATION_FREQUENCIES = { 3928636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, 3929636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NONE }; 3930636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3931636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 3932636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3933636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) { 3934636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 3935636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 39366031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 39376031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 3938636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3939636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 3940636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 3941636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3942636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(hyphenationFrequency); 3943636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3944636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 3945636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 3946636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 3947636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3948636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 3949636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 3950636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 3951636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any hyphenation frequency, hyphenation should not happen if 3952636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // BREAK_STRATEGY_SIMPLE is specified. 3953636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 3954636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 3955636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3956636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3957636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3958636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 3959636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 3960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3961a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxLinesException() { 396372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 396472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 3965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() >> 3); 396672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setMaxLines(-1); 3967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3969a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMinLines() throws Throwable { 3971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 3973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 3974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines - 1); 3976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 397798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines - 1, mTextView.getMinLines()); 397898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 3979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines + 1); 3981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 398298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines + 1, mTextView.getMinLines()); 398398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 3984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3986a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39874b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLines() throws Throwable { 3988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multiple lines 3990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 3991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 3992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines - 1); 3994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 3995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines + 1); 3997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 3998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4001a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLinesException() { 400372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 400472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 400572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setWidth(mTextView.getWidth() >> 3); 400672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setLines(-1); 4007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4010a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingTop() { 4012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingTop()); 4015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4017a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 4019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 4020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop()); 4021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 4025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingTop() > 0); 4027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4030a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingBottom() { 4032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingBottom()); 4035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4037a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 4039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 4040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom()); 4041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 4045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingBottom() > 0); 4047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4049a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 40504b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingTop() throws Throwable { 4051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingTop()); 4054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4056a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 40589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 40596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, top, null, null); 40606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 40616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 4062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop()); 4065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getHeight() 4069fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineTop(mTextView.getLineCount()); 4071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingTop()); 4072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4074a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 40754b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingBottom() throws Throwable { 4076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingBottom()); 4079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4081a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 40839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 40846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, null, null, bottom); 40856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 40866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER_VERTICAL); 4087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom()); 4090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = ((mTextView.getHeight() 4094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingTop() 4096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1) 4097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + mTextView.getExtendedPaddingBottom(); 4098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingBottom()); 4099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4102a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingLeft() { 4104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingLeft()); 4107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4109a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.red); 4110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 10, 100); 4111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, null, null, null); 4112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 4113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4121a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingRight() { 4123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingRight()); 4126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4128a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.red); 4129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 10, 100); 4130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, right, null); 4131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_HORIZONTAL); 4132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 41399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4140a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetUrls() { 4142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = mTextView.getUrls(); 4145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, spans.length); 4146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String url = "http://www.google.com"; 4148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String email = "name@gmail.com"; 4149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = url + " mailto:" + email; 4150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString spannable = new SpannableString(string); 4151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(url), 0, url.length(), 0); 4152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 4155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(email), 0, email.length(), 0); 4158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(email, spans[1].getURL()); 4164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test the situation that param what is not a URLSpan 4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new Object(), 0, 9, 0); 4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 41729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetPadding() { 4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(0, 1, 2, 4); 4178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getPaddingLeft()); 4179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getPaddingTop()); 4180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getPaddingRight()); 4181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getPaddingBottom()); 4182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(10, 20, 30, 40); 4184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(10, mTextView.getPaddingLeft()); 4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20, mTextView.getPaddingTop()); 4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(30, mTextView.getPaddingRight()); 4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(40, mTextView.getPaddingBottom()); 4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 41909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4191a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4192fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testDeprecatedSetTextAppearance() { 4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All); 4196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 4199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 4201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors); 4206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors); 4214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(17f, mTextView.getTextSize(), 0.01f); 4215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style); 4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(null, mTextView.getTypeface()); 4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 42219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4222a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4223fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testSetTextAppearance() { 4224fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4225fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4226fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_All); 4227fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4228fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4229fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(20f, mTextView.getTextSize(), 0.01f); 4230fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4231fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.red), 4232fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4233fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4234fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 42356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 42366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4237fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4238fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Colors); 4239fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4240fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4241fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4242fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4243fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4244fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 42456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.red), 42466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4247fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4248fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_NotColors); 4249fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(17f, mTextView.getTextSize(), 0.01f); 4250fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4251fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4252fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Style); 4253fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(null, mTextView.getTypeface()); 4254fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4255fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 42569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4257a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4258fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testAccessCompoundDrawableTint() { 4259fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4260fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4261fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai ColorStateList colors = ColorStateList.valueOf(Color.RED); 4262fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintList(colors); 4263fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR); 4264fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertSame(colors, mTextView.getCompoundDrawableTintList()); 4265fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4266f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4267f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette // Ensure the tint is preserved across drawable changes. 4268f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawablesRelative(null, null, null, null); 4269f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4270f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4271f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4272f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(null, null, null, null); 4273f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4274f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4275f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4276f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr1 = new ColorDrawable(Color.RED); 4277f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr2 = new ColorDrawable(Color.GREEN); 4278f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr3 = new ColorDrawable(Color.BLUE); 4279f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr4 = new ColorDrawable(Color.YELLOW); 4280f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4); 4281f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4282f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4283fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4284fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4285a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 42864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetHorizontallyScrolling() throws Throwable { 4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the text view has more than one line 4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 1); 4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(true); 4293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 4294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(false); 4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4299a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 43009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeHorizontalScrollRange() throws Throwable { 43019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 43029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 43049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 43059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 43069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 43099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 43109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 43119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set the layout 43149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 43159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getWidth(), 43169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4319a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 43209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeVerticalScrollRange() throws Throwable { 43219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 43229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 43239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 4324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 43259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 43269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollRange()); 4327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 43299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 43309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getHeight(), ((MockTextView) mTextView).computeVerticalScrollRange()); 4331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the layout 43339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 43349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getHeight(), 43359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeVerticalScrollRange()); 4336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4338a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 43399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDrawableStateChanged() throws Throwable { 43409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 43419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 43429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 43439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.refreshDrawableState(); 43449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).drawableStateChanged(); 4345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4348a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultEditable() { 43509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 4351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultEditable() does nothing, and always return false. 43539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView) mTextView).getDefaultEditable()); 4354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4357a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultMovementMethod() { 4359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultMovementMethod() does nothing, and always return null. 4362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getDefaultMovementMethod()); 4363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4366a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetFrame() { 4368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a new size to this view 4371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(0, 0, 320, 480)); 4372b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getLeft()); 4373b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getTop()); 4374b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(320, textView.getRight()); 4375b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(480, textView.getBottom()); 4376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a same size to this view 4378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.setFrame(0, 0, 320, 480)); 4379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //negative input 4381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(-1, -1, -1, -1)); 4382b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getLeft()); 4383b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getTop()); 4384b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getRight()); 4385b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getBottom()); 4386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4388a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 43894b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testMarquee() throws Throwable { 4390354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Both are pointing to the same object. This works around current limitation in CTS 4391354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // coverage report tool for properly reporting coverage of base class method calls. 43929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 43939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mSecondTextView = new MockTextView(mActivity); 4394354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 43959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = mSecondTextView; 43969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(LONG_TEXT); 43979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 43989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setEllipsize(TruncateAt.MARQUEE); 43999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLayoutParams(new LayoutParams(100, 100)); 44009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 44019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4402bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4403bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 44049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView); 4405bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the fading to be shown 44079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setHorizontalFadingEdgeEnabled(true); 4408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 4410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu TestSelectedRunnable runnable = new TestSelectedRunnable(mTextView) { 4413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 44149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(-1); 4415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to start 4416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 44179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(true); 4418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 4419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 44219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // wait for the marquee to run 4424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // fading is shown on both sides if the marquee runs for a while 44259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 44269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f 44279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu && ((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44290f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir // wait for left marquee to fully apply 44309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 44319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.99f); 4432354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 4433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected1()); 4434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected2()); 44359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(-1, mTextView.getMarqueeRepeatLimit()); 4436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu runnable = new TestSelectedRunnable(mTextView) { 4438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 44399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(0); 4440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 4441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 44429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(false); 4443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 44449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setGravity(Gravity.LEFT); 4445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 4447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 44489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected1()); 4451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected2()); 44529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 44539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 44549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getMarqueeRepeatLimit()); 4455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.RIGHT)); 4457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 44589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f); 44599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getRightFadingEdgeStrength(), 0.01f); 4460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.CENTER_HORIZONTAL)); 4462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no left fading (Is it correct?) 44649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 44659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4469a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetMarqueeRepeatLimit() { 44716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final TextView textView = new TextView(mActivity); 44726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 44736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setMarqueeRepeatLimit(10); 44746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(10, textView.getMarqueeRepeatLimit()); 44756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 44766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 44779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4478a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessInputExtras() throws XmlPullParserException, IOException { 44809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 44819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 44829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT); 4483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // do not create the extras 44859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getInputExtras(false)); 4486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // create if it does not exist 44889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Bundle inputExtras = mTextView.getInputExtras(true); 4489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(inputExtras); 4490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(inputExtras.isEmpty()); 4491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it is created already 44939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNotNull(mTextView.getInputExtras(false)); 4494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 44969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputExtras(R.xml.input_extras); 4497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 4498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 4499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4503a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessContentType() { 45059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 45069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 45079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 45089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 45139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 45149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateTimeKeyListener); 4515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 45199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 45209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateKeyListener); 4521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 45259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 45269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TimeKeyListener); 4527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_NUMBER 4529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 45339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 45349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), DigitsKeyListener.getInstance(true, true)); 4535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_PHONE); 45379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 45389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DialerKeyListener); 4539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 45439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 45449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE)); 4545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 45479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 45489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 45539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 45549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.CHARACTERS)); 45569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 4557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 45619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 45629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.WORDS)); 45649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 45699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 45709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.SENTENCES)); 4572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_NULL); 45749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_NULL, mTextView.getInputType()); 45759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TextKeyListener); 4576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4579a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessRawContentType() { 45819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 45829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 45839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 45849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 45899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 45909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 45919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 45969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 45979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 45989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 46049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 46059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_NUMBER 4608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 46129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 46139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 46149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_PHONE); 46179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 46189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 46199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 46259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 46269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 46299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 46359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 46369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 46439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 46509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_NULL); 46549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4659a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 466072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testVerifyDrawable() { 46619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 466272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4663a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 46649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView ) mTextView).verifyDrawable(d)); 466572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 46669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, null); 46679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView ) mTextView).verifyDrawable(d)); 466872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 466972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4670a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 467172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessPrivateImeOptions() { 467272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 467372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 467472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 467572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3"); 467672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions()); 467772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 467872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions(null); 467972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 468072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 468172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4682a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 468372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetOnEditorActionListener() { 468472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 468572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 468698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView.OnEditorActionListener mockOnEditorActionListener = 468798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mock(TextView.OnEditorActionListener.class); 468898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 468972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 469098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setOnEditorActionListener(mockOnEditorActionListener); 469198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 469272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 469372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE); 469498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockOnEditorActionListener, times(1)).onEditorAction(mTextView, 469598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov EditorInfo.IME_ACTION_DONE, null); 469672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 469772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4698a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 469972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeOptions() { 470072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 470172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 470272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 470372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_GO); 470472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions()); 470572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 470672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE); 470772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions()); 470872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 470972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_NULL); 471072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 471172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 471272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4713a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 471472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeActionLabel() { 471572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 471672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getImeActionLabel()); 471772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getImeActionId()); 471872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 471972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeActionLabel("pinyin", 1); 472072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("pinyin", mTextView.getImeActionLabel().toString()); 472172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(1, mTextView.getImeActionId()); 472272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 472372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 47249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4725a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4726d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa public void testAccessImeHintLocales() { 4727d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final TextView textView = new TextView(mActivity); 4728d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setText("", BufferType.EDITABLE); 4729d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setKeyListener(null); 4730d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setRawInputType(InputType.TYPE_CLASS_TEXT); 4731d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(textView.getImeHintLocales()); 4732d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4733d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4734d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4735d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(editorInfo.hintLocales); 4736d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4737d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4738d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US"); 4739d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setImeHintLocales(localeList); 4740d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, textView.getImeHintLocales()); 4741d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4742d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4743d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4744d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, editorInfo.hintLocales); 4745d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4746d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4747d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4748c873101a88e7ba584065de5e912508237378ca99Victoria Lease @UiThreadTest 4749a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 475072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetExtractedText() { 475172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 475272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 475372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.getText().toString()); 475472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 475572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText et = new ExtractedText(); 4756ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4757ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text and selection. 475872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach et.text = "test"; 4759ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 0; 4760ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 2; 476172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 476272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setExtractedText(et); 476372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("test", mTextView.getText().toString()); 4764ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(0, mTextView.getSelectionStart()); 4765ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionEnd()); 4766ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4767ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Use partialStartOffset and partialEndOffset 4768ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 2; 4769ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4770ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = "x"; 4771ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 2; 4772ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 3; 4773ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4774ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4775ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4776ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionStart()); 4777ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, mTextView.getSelectionEnd()); 4778ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4779ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text with spans. 4780ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final SpannableString ss = new SpannableString("ex"); 4781ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new UnderlineSpan(), 0, 2, 0); 4782ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0); 4783ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4784ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = ss; 4785ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 1; 4786ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4787ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4788ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4789ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4790ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final Editable editable = mTextView.getEditableText(); 4791ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans( 4792ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), UnderlineSpan.class); 4793ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, underlineSpans.length); 4794ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, editable.getSpanStart(underlineSpans[0])); 4795ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(underlineSpans[0])); 4796ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4797ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final URLSpan[] urlSpans = mTextView.getEditableText().getSpans( 4798ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), URLSpan.class); 4799ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, urlSpans.length); 4800ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, editable.getSpanStart(urlSpans[0])); 4801ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(urlSpans[0])); 4802ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("ctstest://TextView/test", urlSpans[0].getURL()); 480372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 480472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4805a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 480672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testMoveCursorToVisibleOffset() throws Throwable { 480772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 480872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 480972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // not a spannable text 48104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 481172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 481272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 481372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a selection range 481472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach final String spannableText = "text"; 48156b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 48169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 481772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 4819a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov () -> mTextView.setText(spannableText, BufferType.SPANNABLE)); 482072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 482172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length()); 482272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 482372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getSelectionStart()); 482472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(spannableText.length(), mTextView.getSelectionEnd()); 48254b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 482672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 482772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 482872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a spannable without range 48294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 48306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 48316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(spannableText, BufferType.SPANNABLE); 483272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 483372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 483472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48354b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertTrue(mTextView.moveCursorToVisibleOffset())); 483672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 483772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 483872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4839a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4840afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void testIsInputMethodTarget() throws Throwable { 484172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 484272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isInputMethodTarget()); 484372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 484472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isFocused()); 48454b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 48466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 48476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 48486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu }); 4849afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mInstrumentation.waitForIdleSync(); 4850afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu assertTrue(mTextView.isFocused()); 485104d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu 4852b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mTextView::isInputMethodTarget); 485372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 485472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4856a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 48576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testBeginEndBatchEditAreNotCalledForNonEditableText() { 4858b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir final TextView mockTextView = spy(new TextView(mActivity)); 4859b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 4860b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // TextView should not call onBeginBatchEdit or onEndBatchEdit during initialization 4861b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 4862b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 48636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 486472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.beginBatchEdit(); 4866b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 4867b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 4868b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 48696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.endBatchEdit(); 4871b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 4872b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 4873b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 48746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 48756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 4876a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 48774b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testBeginEndBatchEditCallbacksAreCalledForEditableText() throws Throwable { 48789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new TextView(mActivity))); 48799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 48806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 4881a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final FrameLayout layout = new FrameLayout(mActivity); 48826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 48836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 48846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 48859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 48866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 48876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 48896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 48906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 48929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 48939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 48949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.requestFocus(); 48956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir }); 48966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 48976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 48999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.hasFocus()); 49009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 49019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 49026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 49039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.beginBatchEdit(); 49046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 49059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onBeginBatchEdit(); 49069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 4907b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 49089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 49099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.endBatchEdit(); 49109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 49119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onEndBatchEdit(); 491272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 491372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 491472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 4915a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 491672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBringPointIntoView() throws Throwable { 491772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 491872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(1)); 491972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 492072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.layout(0, 0, 100, 100); 492172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(2)); 492272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 492372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4924a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 492572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testCancelLongPress() { 492672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 49279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 492872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.cancelLongPress(); 492972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 493072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 493172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 4932a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 493372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testClearComposingText() { 493472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 493572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText("Hello world!", BufferType.SPANNABLE); 493672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Spannable text = (Spannable) mTextView.getText(); 493772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 493872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 493972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 494072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 494172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach BaseInputConnection.setComposingSpans((Spannable) mTextView.getText()); 494272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 494372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 494472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 494572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.clearComposingText(); 494672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 494772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 494872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 494972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 49509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4951a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 495272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testComputeVerticalScrollExtent() { 49539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 49549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 495572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4956a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 49579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, d); 495872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 49599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 496072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 496172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 496272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 4963a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 496472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testDidTouchFocusSelect() { 4965c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne mTextView = new EditText(mActivity); 496672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.didTouchFocusSelect()); 496772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 496872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setFocusable(true); 496972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.requestFocus(); 497072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.didTouchFocusSelect()); 497172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 497272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4973a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 49744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSelectAllJustAfterTap() throws Throwable { 49750ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Prepare an EditText with focus. 49769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 49776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 49786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 49790ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 49806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(mTextView.didTouchFocusSelect()); 49816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 49826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 49836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.didTouchFocusSelect()); 49840ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 49856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello, World.", BufferType.SPANNABLE); 49860ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 49870ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 49880ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 49890ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Tap the view to show InsertPointController. 49909404cdc3d439d5a2d1b805934c53a8ba6dc68fa8Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 499183a70cb57c839148a4feff786cdbb3803828d484Bobby Wang // bad workaround for waiting onStartInputView of LeanbackIme.apk done 499283a70cb57c839148a4feff786cdbb3803828d484Bobby Wang try { 499383a70cb57c839148a4feff786cdbb3803828d484Bobby Wang Thread.sleep(1000); 499483a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } catch (InterruptedException e) { 499583a70cb57c839148a4feff786cdbb3803828d484Bobby Wang e.printStackTrace(); 499683a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } 49970ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 49980ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Execute SelectAll context menu. 49999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.onTextContextMenuItem(android.R.id.selectAll)); 50000ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 50010ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 50020ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // The selection must be whole of the text contents. 50030ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(0, mTextView.getSelectionStart()); 500483a70cb57c839148a4feff786cdbb3803828d484Bobby Wang assertEquals("Hello, World.", mTextView.getText().toString()); 50050ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(mTextView.length(), mTextView.getSelectionEnd()); 50060ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 50070ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 50089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5009a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 501072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testExtractText() { 501172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 501272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 501372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedTextRequest request = new ExtractedTextRequest(); 501472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText outText = new ExtractedText(); 501572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 501672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.token = 0; 501772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.flags = 10; 501872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxLines = 2; 501972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxChars = 20; 502072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 502172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 502272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 502372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 502472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 502572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 502672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach outText.text.toString()); 5027c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi 5028c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi // Tests for invalid arguments. 5029c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(request, null)); 5030c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, outText)); 5031c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, null)); 503272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 503372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 503494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5035a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 503694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testTextDirectionDefault() { 5037c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 50382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 503994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 504094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 504194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5042a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 504394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testSetGetTextDirection() { 5044c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 504594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 504694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 50472a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection()); 504894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 504994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 50502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection()); 505194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 505294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 50532a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 505494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 505594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 50562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection()); 505794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 505894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 50592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection()); 506094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 506194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 50622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection()); 506302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 506402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 506502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection()); 506602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 506702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 506802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection()); 506994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 507094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 507194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5072a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 507394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtr() { 5074c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 507594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 507694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 50772a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 507894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 507994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 50802a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 508194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 508294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 50832a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 508494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 508594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 50862a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 508794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 508894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 50892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 509094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 509194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 50922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 509394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 509494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 50952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 509602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 509702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 509802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 509902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 510002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 510102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 510294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 510394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 510494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5105a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 510694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtrWithInheritance() { 5107c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 510894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 510994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5110c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 511194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 511294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 511394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 511494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 51152a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 511694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 511794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 51182a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 511994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 512094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 51212a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 512294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 512394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 51242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 512594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 512694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 51272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 512894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 512994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 51302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 513102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 513202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 513302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 513402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 513502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 513602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 513794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 513894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 513994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5140a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 514194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtl() { 5142c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 514394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 514494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 51452a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 514694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 514794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 51482a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 514994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 515094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 51512a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 515294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 515394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 51542a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 515594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 515694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 51572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 515894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 515994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 51602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 516194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 516294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 51632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 516402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 516502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 516602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 516702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 516802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 516902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 517094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 517194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 517294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 517494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtlWithInheritance() { 5175c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 517694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 517794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5178c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 517994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 518094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 518194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 518294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 51832a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 518494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 518594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 51862a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 518794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 518894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 51892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 519094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 519194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 51922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 519394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 519494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 51952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 519694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 519794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 51982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 519994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 520002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 520102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 520202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 520302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 520402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 520502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 520694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio // Force to RTL text direction on the layout 520794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 520894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 520994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52102a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 521194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 521294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52132a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 521494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 521594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52162a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 521794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 521894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 52192a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 522094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 52222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 522394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 52252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 522602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 522702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 522802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 522902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 523002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 523102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 523294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 523394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 523494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5235a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 523694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testResetTextDirection() { 5237c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5238c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 523994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 524094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 524194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52422a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 524394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5244f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // No reset when we remove the view 524594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.removeView(tv); 5246f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 5247f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio 5248f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // Reset is done when we add the view 5249f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio ll.addView(tv); 52502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 525194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 525294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 525302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5254a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 525502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongLtr() { 525602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 525702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 525802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 525902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 526002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 526102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 526202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 526302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 526402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 526502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 526602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 526702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 526802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 526902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 527002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 527102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 527202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 527302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 527402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 527502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 527602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 527702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 527802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 527902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 528002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 528102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 528202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 528302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 528402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 528502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 528602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 528702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 528802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is LTR. 528902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 529002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 529102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 529202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 529302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 529402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 529502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 529602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 529702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 529802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 529902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 530002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 530102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 530202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 530302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 530402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5305a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 530602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongRtl() { 530702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 530802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 530902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 531002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 531102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 531202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 531302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 531402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 531502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 531602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 531702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 531802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 531902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 532002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 532102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 532202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 532302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 532402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 532502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 532602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 532702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 532802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 532902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 533002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 533102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 533202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 533302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 533402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 533502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 533602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 533702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 533802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 533902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is RTL. 534002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 534102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 534302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 534402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 534502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 534702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 534802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 535002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 535102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 535202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 535302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 535402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 53559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5356a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5357c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader public void testTextLocales() { 5358c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader TextView tv = new TextView(mActivity); 5359c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.getDefault(), tv.getTextLocale()); 5360c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.getDefault(), tv.getTextLocales()); 5361c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5362c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(Locale.CHINESE); 5363c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.CHINESE, tv.getTextLocale()); 5364c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales()); 5365c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5366c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(LocaleList.forLanguageTags("en,ja")); 5367c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale()); 5368c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales()); 5369c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5370c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5371c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(null); 5372c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to null should throw"); 5373c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5374c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5375c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5376c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5377c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5378c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(null); 5379c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locales to null should throw"); 5380c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5381c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5382c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5383c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5384c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5385c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(new LocaleList()); 5386c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to an empty list should throw"); 5387c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5388c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5389c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5390c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5391c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 53929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5393a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5394b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka public void testAllCapsLocalization() { 5395b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka String testString = "abcdefghijklmnopqrstuvwxyz"; 5396b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5397b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka // The capitalized characters of "i" on Turkish and Azerbaijani are different from English. 5398b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka Locale[] testLocales = { 5399b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("az", "AZ"), 5400b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("tr", "TR"), 5401b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka new Locale("en", "US"), 5402b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka }; 5403b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5404b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka TextView tv = new TextView(mActivity); 5405b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setAllCaps(true); 5406b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka for (Locale locale: testLocales) { 5407b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setTextLocale(locale); 5408b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka assertEquals("Locale: " + locale.getDisplayName(), 5409b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka testString.toUpperCase(locale), 5410b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.getTransformationMethod().getTransformation(testString, tv).toString()); 5411b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5412b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5413b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5414dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5415a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5416dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testTextAlignmentDefault() { 5417a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 54187fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5419dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // resolved default text alignment is GRAVITY 54207fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5421dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5422dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5423dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5424a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5425dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testSetGetTextAlignment() { 5426a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5427dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5428dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 54297fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5430dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5431dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 54327fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment()); 5433dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5434dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 54357fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment()); 5436dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5437dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 54387fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment()); 5439dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5440dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 54417fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment()); 5442dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5443dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 54447fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment()); 5445dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5446dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5447dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5448a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5449dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignment() { 5450a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5451dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 54527fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5453dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5454757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test center alignment first so that we dont hit the default case 5455dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 54567fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5457dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5458757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test the default case too 5459757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5460757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5461757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio 5462dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 54637fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5464dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5465dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 54667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5467dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5468dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 54697fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5470dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5471dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 54727fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5473dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5474dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5475dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5476a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5477dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignmentWithInheritance() { 5478a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = new LinearLayout(mActivity); 5479dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5480dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5481a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5482dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.addView(tv); 5483dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5484dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // check defaults 54857fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5486dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5487dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5488dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // set inherit and check that child is following parent 5489dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 54907fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment()); 5491dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5492dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 54937fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5494dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5495dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 54967fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5497dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5498dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 54997fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5500dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5501dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 55027fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5503dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5504dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 55057fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5506dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5507dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // now get rid of the inheritance but still change the parent 5508dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5509dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5510dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 55117fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5512dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5513dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 55147fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5515dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5516dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 55177fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5518dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5519dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 55207fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5521dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5522dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 55237fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5524dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5525dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5526dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5527a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5528dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testResetTextAlignment() { 5529a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5530a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 5531dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5532dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5533dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 55347fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5535dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 55364f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // No reset when we remove the view 5537dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.removeView(tv); 55384f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 55394f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio 55404f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Reset is done when we add the view 55414f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Default text alignment is GRAVITY 55424f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio ll.addView(tv); 55437fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5544dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5545dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5546938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @UiThreadTest 5547a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5548938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testDrawableResolution() { 5549b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5550938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5551a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5552938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5553a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5554938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5555b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5556b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.2: left / right drawable defined in default RTL mode 5557938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5558a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5559938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5560a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5561938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5562b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5563b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.1: start / end drawable defined in LTR mode 5564938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_1); 5565a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5566938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5567a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5568938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5569b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5570b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.2: start / end drawable defined in RTL mode 5571938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_2); 5572a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5573938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5574a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5575938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5576b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5577b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.1: left / right / start / end drawable defined in LTR mode 5578938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_1); 5579a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5580938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5581a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5582938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5583b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5584b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.2: left / right / start / end drawable defined in RTL mode 5585938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_2); 5586a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5587938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5588a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5589938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5590b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5591b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.1: start / end drawable defined in LTR mode inside a layout 5592b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5593938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_1); 5594a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5595938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5596a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5597938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5598b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5599b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.2: start / end drawable defined in RTL mode inside a layout 5600b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5601938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_2); 5602a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5603938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5604a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5605938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5606b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5607b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout 5608b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5609938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_1); 5610a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5611938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5612a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5613938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5614b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5615b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout 5616b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5617938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_2); 5618a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5619938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5620a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5621938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5622b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio } 5623b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 56249776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio @UiThreadTest 5625a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 56269776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio public void testDrawableResolution2() { 56279776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5628938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5629a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5630938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 56319776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5632a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(null, null, 5633a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null); 5634a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, R.drawable.icon_yellow, -1, -1); 56359776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5636938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5637a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5638938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 56399776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5640a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null, 5641a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null); 5642a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 56439776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5644938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_ltr); 5645a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, -1, -1, -1); 56469776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5647a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_blue), null, 5648a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_red), null); 5649a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, -1, -1); 56509776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5651a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawablesRelative(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), 5652a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null, null); 5653a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 5654938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 5655938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5656a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5657938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testCompoundAndTotalPadding() { 5658938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Resources res = mActivity.getResources(); 5659938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int drawablePadding = res.getDimensionPixelSize(R.dimen.textview_drawable_padding); 5660938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingLeft = res.getDimensionPixelSize(R.dimen.textview_padding_left); 5661938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingRight = res.getDimensionPixelSize(R.dimen.textview_padding_right); 5662938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingTop = res.getDimensionPixelSize(R.dimen.textview_padding_top); 5663938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingBottom = res.getDimensionPixelSize(R.dimen.textview_padding_bottom); 5664938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int iconSize = TestUtils.dpToPx(mActivity, 32); 5665938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5666938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewLtr = (TextView) mActivity.findViewById( 5667938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_ltr); 5668938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftLtr = paddingLeft + drawablePadding + iconSize; 5669938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightLtr = paddingRight + drawablePadding + iconSize; 5670938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingLeft()); 5671938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingStart()); 5672938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingLeft()); 5673938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingStart()); 5674938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingRight()); 5675938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingEnd()); 5676938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingRight()); 5677938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingEnd()); 5678938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5679938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingTop()); 5680938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5681938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingBottom()); 5682938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5683938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewRtl = (TextView) mActivity.findViewById( 5684938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_rtl); 5685938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftRtl = paddingLeft + drawablePadding + iconSize; 5686938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightRtl = paddingRight + drawablePadding + iconSize; 5687938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingLeft()); 5688938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingEnd()); 5689938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingLeft()); 5690938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingEnd()); 5691938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingRight()); 5692938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingStart()); 5693938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingRight()); 5694938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingStart()); 5695938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5696938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingTop()); 5697938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5698938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingBottom()); 56999776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 57009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 57019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5702a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5703e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetBreakStrategy() { 5704e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5705e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5706a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final PackageManager pm = mInstrumentation.getTargetContext().getPackageManager(); 57072751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka 5708d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for 57092751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // TextView except for Android Wear. The default value for Android Wear is 57102751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // BREAK_STRATEGY_BALANCED. 57112751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { 57122751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // Android Wear 57132751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 57142751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } else { 57152751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // All other form factor. 57162751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 57172751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } 5718e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5719e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5720e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy()); 5721e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5722e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5723e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 5724e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5725e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5726e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 5727d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5728d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi EditText et = new EditText(mActivity); 5729d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5730d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for 5731d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // EditText. 5732d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5733d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5734d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5735d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5736d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5737d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5738d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy()); 5739d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5740d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5741d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy()); 5742e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5743e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 57449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5745a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5746e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetHyphenationFrequency() { 5747e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5748e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5749d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5750e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5751e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 5752e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency()); 5753e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5754e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); 5755e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5756e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5757e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); 5758e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency()); 5759e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5760e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5761a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @UiThreadTest 5762a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @Test 5763a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka public void testSetGetJustify() { 5764a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka TextView tv = new TextView(mActivity); 5765a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 5766598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 5767598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_INTER_WORD); 5768598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, tv.getJustificationMode()); 5769598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_NONE); 5770598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 5771a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka } 5772a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 5773a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 57744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetAndGetCustomSelectionActionModeCallback() throws Throwable { 577532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final String text = "abcde"; 57769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 57776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 57786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 57796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 57806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTextIsSelectable(true); 57816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 57826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 578332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 578432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 578532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 578632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 578732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomSelectionActionModeCallback()); 578832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 578998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 579098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 579198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 579298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomSelectionActionModeCallback(mockActionModeCallback); 579398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, 579432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.getCustomSelectionActionModeCallback()); 579532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 57969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 57976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 57986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 57996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 58006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 58016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 58026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 580332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 580432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 580532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 580698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 580798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 580832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 58099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 58106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 58116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 581232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 581332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 581432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 581532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was blocked. 581698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, never()).onDestroyActionMode(any(ActionMode.class)); 581732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 581898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov // Reset and reconfigure callback. 581998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockActionModeCallback); 582098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 582198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.TRUE); 582298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomSelectionActionModeCallback()); 582332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 58249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 58256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 58266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 58276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 58286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 58296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 58306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 583132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 583232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 583332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 583432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 583598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 583698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 583732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 58389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 58396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 58406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 584132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 584232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 584332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 584432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was started 584598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onDestroyActionMode(any(ActionMode.class)); 584632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 584732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 58486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 5849a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 585098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testSetAndGetCustomInsertionActionMode() { 585132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi initTextViewForTyping(); 585232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 585332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomInsertionActionModeCallback()); 585432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 585598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 585698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 585798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 585898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomInsertionActionModeCallback(mockActionModeCallback); 585998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomInsertionActionModeCallback()); 586032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // TODO(Bug: 22033189): Tests the set callback is actually used. 586132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 586232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 586389b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @UiThreadTest 586489b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @Test 586589b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky public void testRespectsViewFocusability() { 586689b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky TextView v = (TextView) mActivity.findViewById(R.id.textview_singleLine); 586789b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertFalse(v.isFocusable()); 586889b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky // TextView used to set focusable to true or false verbatim which would break the following. 586989b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky v.setClickable(true); 587089b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertTrue(v.isFocusable()); 587189b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky } 587289b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky 5873a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 58749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testTextShadows() throws Throwable { 587598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textViewWithConfiguredShadow = 587698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov (TextView) mActivity.findViewById(R.id.textview_with_shadow); 5877a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, textViewWithConfiguredShadow.getShadowDx(), 0.0f); 5878a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, textViewWithConfiguredShadow.getShadowDy(), 0.0f); 5879a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textViewWithConfiguredShadow.getShadowRadius(), 0.0f); 588098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.GREEN, textViewWithConfiguredShadow.getShadowColor()); 588132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 588298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 5883a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDx(), 0.0f); 5884a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDy(), 0.0f); 5885a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowRadius(), 0.0f); 588632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 58879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setShadowLayer(5.0f, 3.0f, 4.0f, Color.RED)); 588898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mInstrumentation.waitForIdleSync(); 5889a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textView.getShadowDx(), 0.0f); 5890a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(4.0f, textView.getShadowDy(), 0.0f); 5891a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(5.0f, textView.getShadowRadius(), 0.0f); 589298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.RED, textView.getShadowColor()); 589372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 589472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5895a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 58964b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testFontFeatureSettings() throws Throwable { 5897354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 5898354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.isEmpty(textView.getFontFeatureSettings())); 5899354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 59009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("smcp")); 5901354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 5902354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("smcp", textView.getFontFeatureSettings()); 5903354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 59049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("frac")); 5905354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 5906354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("frac", textView.getFontFeatureSettings()); 5907354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5908354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5909354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private static class SoftInputResultReceiver extends ResultReceiver { 5910354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private boolean mIsDone; 5911354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private int mResultCode; 5912354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5913354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public SoftInputResultReceiver(Handler handler) { 5914354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov super(handler); 5915354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5916354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5917354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov @Override 5918354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov protected void onReceiveResult(int resultCode, Bundle resultData) { 5919354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mResultCode = resultCode; 5920354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = true; 5921354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5922354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5923354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void reset() { 5924354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = false; 5925354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5926354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5927354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5928a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 59294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessShowSoftInputOnFocus() throws Throwable { 5930354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov if (!mActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS)) { 5931354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov return; 5932354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5933354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 593458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare a test Layout 593558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // will add an focusable TextView so that EditText will not get focus at activity start 593658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final TextView textView = new TextView(mActivity); 593758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusable(true); 593858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusableInTouchMode(true); 593958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // EditText to test 594058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final EditText editText = new EditText(mActivity); 594158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setShowSoftInputOnFocus(true); 594258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusable(true); 594358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusableInTouchMode(true); 594458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare and set the layout 594558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final LinearLayout layout = new LinearLayout(mActivity); 594658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.setOrientation(LinearLayout.VERTICAL); 594758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(textView, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 594858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 594958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(editText, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 595058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 595158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 595258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 595358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 5954354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 5955354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 595658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(editText.getShowSoftInputOnFocus()); 5957354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5958354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And emulate click on it 595958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 5960354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5961354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Verify that input method manager is active and accepting text 5962354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final InputMethodManager imManager = (InputMethodManager) mActivity 5963354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .getSystemService(Context.INPUT_METHOD_SERVICE); 5964b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(imManager::isActive); 5965354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(imManager.isAcceptingText()); 596658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(imManager.isActive(editText)); 5967354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5968354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Since there is no API to check that soft input is showing, we're going to ask 5969354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // the input method manager to show soft input, passing our custom result receiver. 5970354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're expecting to get UNCHANGED_SHOWN, indicating that the soft input was already 5971354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // showing before showSoftInput was called. 5972354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov SoftInputResultReceiver receiver = new SoftInputResultReceiver(mHandler); 597358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 5974354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 5975354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_UNCHANGED_SHOWN, receiver.mResultCode); 5976354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5977354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 5978a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 5979354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5980354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Reconfigure our edit text to not show soft input on focus 598158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> editText.setShowSoftInputOnFocus(false)); 5982354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 598358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertFalse(editText.getShowSoftInputOnFocus()); 5984354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5985354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Emulate click on it 598658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 5987354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5988354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Ask input method manager to show soft input again. This time we're expecting to get 5989354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // SHOWN, indicating that the soft input was not showing before showSoftInput was called. 5990354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov receiver.reset(); 599158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 5992354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 5993354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_SHOWN, receiver.mResultCode); 5994354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5995354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 5996a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 5997354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 5998354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 5999a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 60004b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testIsSuggestionsEnabled() throws Throwable { 600141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 600241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 600341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything without InputType.TYPE_CLASS_TEXT doesn't have suggestions enabled 60044b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_DATETIME)); 600541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 600641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60074b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_PHONE)); 600841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 600941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_NUMBER)); 601141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 601241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 601341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // From this point our text view has InputType.TYPE_CLASS_TEXT 601441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 601541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything with InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS doesn't have suggestions enabled 60164b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 601741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 601841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 601941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 602041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 602241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 602341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | 602441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 602541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 602641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 602841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 602941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | 603041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 603141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 603241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 603341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Otherwise suggestions are enabled for specific type variations enumerated in the 603441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // documentation of TextView.isSuggestionsEnabled 60354b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 603641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 603741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL)); 603841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 603941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60404b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 604141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 604241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT)); 604341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 604441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60454b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 604641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 604741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE)); 604841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 604941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60504b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 605141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 605241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE)); 605341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 605441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60554b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 605641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 605741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT)); 605841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 605941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 606041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // and not on any other type variation 60614b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 606241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 606341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)); 606441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 606541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60664b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 606741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 606841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER)); 606941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 607041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 607241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 607341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)); 607441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 607541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60764b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 607741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 607841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME)); 607941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 608041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60814b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 608241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 608341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC)); 608441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 608541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 608741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 608841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS)); 608941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 609041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60914b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 609241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 609341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI)); 609441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 609541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 60964b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 609741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 609841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 609941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)); 610041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 610141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 61024b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 610341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 610441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 610541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS)); 610641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 610741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 61084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 610941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 611041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD)); 611141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 611241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 611341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6114a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61154b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessLetterSpacing() throws Throwable { 611641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 6117a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, mTextView.getLetterSpacing(), 0.0f); 611841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 611941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final CharSequence text = mTextView.getText(); 612041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int textLength = text.length(); 612141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 612241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at the default letter spacing 612341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] initialWidths = new float[textLength]; 612441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), initialWidths); 612541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 612641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 1.0f 61274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 612841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(1.0f)); 6129a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mTextView.getLetterSpacing(), 0.0f); 613041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] singleWidths = new float[textLength]; 613141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), singleWidths); 613241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 613341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 2.0f 61344b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 613541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(2.0f)); 6136a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, mTextView.getLetterSpacing(), 0.0f); 613741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] doubleWidths = new float[textLength]; 613841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), doubleWidths); 613941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 614041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Since letter spacing setter treats the parameter as EM units, and we don't have 614141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // a way to convert EMs into pixels, go over the three arrays of advance widths and 614241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // test that the extra advance width at letter spacing 2.0f is double the extra 614341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // advance width at letter spacing 1.0f. 614441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov for (int i = 0; i < textLength; i++) { 614541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float singleWidthDelta = singleWidths[i] - initialWidths[i]; 614641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float doubleWidthDelta = doubleWidths[i] - initialWidths[i]; 614741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("At index " + i + " initial is " + initialWidths[i] + 614841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov ", single is " + singleWidths[i] + " and double is " + doubleWidths[i], 614941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov singleWidthDelta * 2.0f, doubleWidthDelta, 0.05f); 615041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 615141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 615241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6153a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61544b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testTextIsSelectableFocusAndOnClick() throws Throwable { 6155288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // Prepare a focusable TextView with an onClickListener attached. 6156288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu final View.OnClickListener mockOnClickListener = mock(View.OnClickListener.class); 6157d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu final int safeDoubleTapTimeout = ViewConfiguration.getDoubleTapTimeout() + 1; 61589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6159288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView = new TextView(mActivity); 616052e5d256861edd0ff4f58da581b8bbd9df1c1d99Siyamed Sinir mTextView.setText("...text 11:11. some more text is in here..."); 6161288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setFocusable(true); 6162288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setOnClickListener(mockOnClickListener); 6163288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mActivity.setContentView(mTextView); 6164288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu }); 6165288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6166288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6167288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isTextSelectable()); 6168288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocusableInTouchMode()); 6169288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6170288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isInTouchMode()); 6171288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6172288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view triggers onClick() but does not focus the TextView. 61738bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6174d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6175288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6176288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6177288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6178288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6179d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // So does the second tap. 61808bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6181d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6182288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6183288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6184288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6185288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 61869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTextIsSelectable(true)); 6187288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6188288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6189288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isTextSelectable()); 6190288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusableInTouchMode()); 6191288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6192288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6193288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view focuses the TextView but does not trigger onClick(). 6194288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 61958bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6196d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6197288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6198288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6199288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, never()).onClick(mTextView); 6200288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6201d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // The second tap triggers onClick() and keeps the focus. 62028bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6203d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6204288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6205288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6206288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6207288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu } 6208288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 620941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov private void verifyGetOffsetForPosition(final int x, final int y) { 621041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int actual = mTextView.getOffsetForPosition(x, y); 621141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 621241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final Layout layout = mTextView.getLayout(); 621341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov if (layout == null) { 621441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", -1, actual); 621541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov return; 621641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 621741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 621841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the line which corresponds to the Y position 621941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int line = layout.getLineForVertical(y + mTextView.getScrollY()); 622041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the offset in that line that corresponds to the X position 622141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int expected = layout.getOffsetForHorizontal(line, x + mTextView.getScrollX()); 622241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", expected, actual); 622341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 622441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6225a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 62264b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetOffsetForPosition() throws Throwable { 622741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 62284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, () -> { 622941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setText(LONG_TEXT); 623041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setPadding(0, 0, 0, 0); 623141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov }); 623241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 623341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertNotNull(mTextView.getLayout()); 623441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewWidth = mTextView.getWidth(); 623541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewHeight = mTextView.getHeight(); 623641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int lineHeight = mTextView.getLineHeight(); 623741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 623841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, 0); 623941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, viewHeight / 2); 624041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 3, lineHeight / 2); 624141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 2, viewHeight / 2); 624241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth, viewHeight); 624341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 624441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 624557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @UiThreadTest 6246a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 624757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void testOnResolvePointerIcon() throws InterruptedException { 624857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView selectableTextView = findTextView(R.id.textview_pointer); 624957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final MotionEvent event = createMouseHoverEvent(selectableTextView); 625057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 625157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable view shows the I beam 625257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 625357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 625457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 625557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 625657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(false); 625757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 625857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A clickable view shows the hand 625957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setLinksClickable(true); 626057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri SpannableString builder = new SpannableString("hello world"); 626157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setText(builder, BufferType.SPANNABLE); 626257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri Spannable text = (Spannable) selectableTextView.getText(); 626357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri text.setSpan( 626457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri new ClickableSpan() { 626557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @Override 626657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void onClick(View widget) { 626757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 626857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 626957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri }, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 627057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 627157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 627257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 627357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 627457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable & clickable view shows hand 627557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 627657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 627757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 627857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 627957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 628057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // An editable view shows the I-beam 628157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView editableTextView = new EditText(mActivity); 628257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 628357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 628457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri editableTextView.onResolvePointerIcon(event, 0)); 628557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 628657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 62879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 62886b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapInside() throws Throwable { 62899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 62909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 62919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 62929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(1)).onClick(mTextView); 62939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 62949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 62959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 62966b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDoubleTapInside() throws Throwable { 62979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 62989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDoubleTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 62999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 6300db34dc417570084e1598de3a6ebdacab4bbf1d66Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(2)).onClick(mTextView); 63019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 63029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 63039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 63046b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapOutside() throws Throwable { 63059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 63069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosOutside, 63079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosOutside); 63089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 63099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 63109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 63119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 63126b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDragOutside() throws Throwable { 63139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 63149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int[] viewOnScreenXY = new int[2]; 63159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLocationOnScreen(viewOnScreenXY); 63169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 63179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SparseArray<Point> swipeCoordinates = new SparseArray<>(); 63189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(0, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside, 63199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside)); 63209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(1, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside + 50, 63219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside + 50)); 63229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDragGesture(mInstrumentation, swipeCoordinates); 63239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 63249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 63259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 6326771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @UiThreadTest 6327771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 6328771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu public void testOnInitializeA11yNodeInfo_populatesHintTextProperly() { 6329771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6330771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText("", BufferType.EDITABLE); 6331771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String hintText = "Hint text"; 6332771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setHint(hintText); 6333771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); 6334771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6335771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6336771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not showing as accessibility text", 6337771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getText())); 6338771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6339771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6340771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6341771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String nonHintText = "Something else"; 6342771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText(nonHintText, BufferType.EDITABLE); 6343771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6344771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertFalse("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6345771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Text not provided to accessibility", 6346771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(nonHintText, info.getText())); 6347771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6348771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6349771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6350771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 63515b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu @Test 635276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testAutoSize_setEllipsize() throws Throwable { 635376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById( 635476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 635576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeType = textView.getAutoSizeTextType(); 635676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMinTextSize = textView.getAutoSizeMinTextSize(); 635776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMaxTextSize = textView.getAutoSizeMaxTextSize(); 635876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeGranularity = textView.getAutoSizeStepGranularity(); 635976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialSizes = textView.getAutoSizeTextAvailableSizes().length; 636076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 636176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(null, textView.getEllipsize()); 636276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Verify styled attributes. 636376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, initialAutoSizeType); 636476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMinTextSize); 636576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMaxTextSize); 636676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Because this TextView has been configured to use predefined sizes. 636776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, initialAutoSizeGranularity); 636876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, initialSizes); 636976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 637076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 637176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 637276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 637376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 637476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 637576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Beside the ellipsis no auto-size attribute has changed. 637676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeType, textView.getAutoSizeTextType()); 637776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMinTextSize, textView.getAutoSizeMinTextSize()); 637876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMaxTextSize, textView.getAutoSizeMaxTextSize()); 637976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeGranularity, textView.getAutoSizeStepGranularity()); 638076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialSizes, textView.getAutoSizeTextAvailableSizes().length); 638176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 638276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 638376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 638476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testEllipsize_setAutoSize() throws Throwable { 638576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu TextView textView = findTextView(R.id.textview_text); 638676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 638776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 638876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 638976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 639076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 639176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 639276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 639376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 639476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(0, textView.getAutoSizeTextAvailableSizes().length); 639576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 639676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 639776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 639876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 639976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 640076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // The auto-size defaults have been used. 640176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMinTextSize()); 640276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMaxTextSize()); 640376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeStepGranularity()); 640476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, textView.getAutoSizeTextAvailableSizes().length); 640576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 640676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 640776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 6408cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawables() throws Throwable { 6409069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64109000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6411069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6412cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6413c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6414cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6415cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setCompoundDrawables(drawable, drawable, drawable, drawable)); 6416cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6417069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6418069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6419cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6420cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6421cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6422cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablesRelative() throws Throwable { 6423069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64249000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6425069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6426cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6427c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6428cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablesRelative( 6429cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6430cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6431069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6432069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6433cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6434cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6435cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6436cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablePadding() throws Throwable { 6437069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64389000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6439cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // Prepare a larger layout in order not to hit the min value easily. 6440cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6441cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setWidth(autoSizeTextView.getWidth() * 2); 6442cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setHeight(autoSizeTextView.getHeight() * 2); 6443cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu }); 6444cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 6445cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Setup the drawables before setting their padding in order to modify the available 6446cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // space and trigger a resize. 6447cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6448cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 4, autoSizeTextView.getHeight() / 4); 6449cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawables( 6450cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6451cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6452069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6453cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablePadding( 6454cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.getCompoundDrawablePadding() + 10)); 6455cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6456069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6457069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6458cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6459cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6460cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6461cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPadding() throws Throwable { 6462069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64639000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6464069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6465c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPadding( 6466c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6467c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6468cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6469069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6470069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6471cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6472cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6473cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6474cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPaddingRelative() throws Throwable { 6475069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64769000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6477069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6478cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6479c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPaddingRelative( 6480c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6481c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6482cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6483069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6484069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6485cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6486cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6487cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6488cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTextScaleX() throws Throwable { 6489069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 64909000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6491069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6492cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6493cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6494069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX() * 4.5f)); 6495cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6496069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6497069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6498069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6499069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6500cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6501cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX())); 6502cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6503069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6504069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6505cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6506cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6507cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6508cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTypeface() throws Throwable { 6509069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 65109000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6511069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6512069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setText("The typeface change needs a bit more text then " 6513069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the default used for this batch of tests in order to get to resize text." 6514069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + " The resize function is always called but even with different typefaces " 6515069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "there may not be a need to resize text because it just fits. The longer " 6516069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the text, the higher the chance for a resize. And here is yet another " 6517069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "sentence to make sure this test is not flaky. Not flaky at all.")); 6518069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6519069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6520cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6521c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6522c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu Typeface differentTypeface = Typeface.MONOSPACE; 6523c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu if (autoSizeTextView.getTypeface() == Typeface.MONOSPACE) { 6524c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu differentTypeface = Typeface.SANS_SERIF; 6525c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu } 6526c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setTypeface(differentTypeface); 6527c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu }); 6528cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6529069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6530069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6531069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Don't really know if it is larger or smaller (depends on the typeface chosen above), 6532069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // but it should definitely have changed. 6533069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertNotEquals(initialTextSize, changedTextSize, 0f); 6534069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6535cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6536cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTypeface(autoSizeTextView.getTypeface())); 6537cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6538069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6539069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6540cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6541cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6542cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6543cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLetterSpacing() throws Throwable { 6544069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 65459000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6546069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6547cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6548cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6549c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // getLetterSpacing() could return 0, make sure there is enough of a difference to 6550c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // trigger auto-size. 6551c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setLetterSpacing( 6552069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLetterSpacing() * 1.5f + 4.5f)); 6553cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6554069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6555cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6556069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6557c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 6558cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6559069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setLetterSpacing(autoSizeTextView.getLetterSpacing())); 6560cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6561069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6562069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6563cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6564cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6565cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6566cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHorizontallyScrolling() throws Throwable { 6567069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 65689000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6569069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6570cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling( 6571cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu !autoSizeTextView.getHorizontallyScrolling())); 6572cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6573069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6574069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6575069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6576069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6577cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling( 6578cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getHorizontallyScrolling())); 6579cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6580cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6581069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6582cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6583cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6584cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6585cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxLines() throws Throwable { 6586069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 65879000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6588069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6589cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(1)); 6590cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6591069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6592069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6593cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6594cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6595cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6596cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxHeight() throws Throwable { 6597069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 65989000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6599069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6600069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6601069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6602069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6603069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6604069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6605069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6606c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxHeight( 6607069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6608cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6609069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6610069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6611cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6612cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6613cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6614cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHeight() throws Throwable { 6615069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66169000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6617069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6618069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6619069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6620069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6621069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6622069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6623069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6624c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 6625c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6626cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6627069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6628069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6629cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6630cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6631cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6632cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLines() throws Throwable { 6633069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66349000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6635069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6636069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLines(1)); 6637cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6638069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6639069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6640cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6641cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6642cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6643cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxWidth() throws Throwable { 6644069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66459000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6646cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width only. 6647cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6648cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 6649069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 6650cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6651cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6652069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6653c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxWidth( 6654c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 6655cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6656069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6657069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 6658cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6659cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6660cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6661cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setWidth() throws Throwable { 6662069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66639000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6664069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact width only. 6665069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6666069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 6667069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 6668069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6669069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6670cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6671069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6672c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setWidth( 6673c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 6674cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6675069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6676069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 6677cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6678cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6679cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6680cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLineSpacing() throws Throwable { 6681069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66829000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6683069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6684c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 6685cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 6686069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra() * 4, 6687069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier() * 4)); 6688cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6689069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6690069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6691069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6692069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6693cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 6694cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra(), 6695cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier())); 6696cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6697069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6698069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6699069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu } 6700069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6701069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu @Test 6702069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu public void testAutoSizeCallers_setTextSizeIsNoOp() throws Throwable { 6703069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67049000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6705069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6706069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6707069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setTextSize( 6708069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu initialTextSize + 123f)); 6709069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6710069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6711069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 6712cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6713cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6714cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 67159000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributes() { 67165b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 67179000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 67189000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 67195b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 67209000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // The size has been set to 50dp in the layout but this being an AUTO_SIZE_TEXT_TYPE_UNIFORM 6721771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // TextView, the size is considered max size thus the value returned by getSize() in this 6722771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // case should be lower than the one set (given that there is not much available space and 6723771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // the font size is very high). In theory the values could be equal for a different TextView 67245b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu // configuration. 67255b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu final float sizeSetInPixels = TypedValue.applyDimension( 67265b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu TypedValue.COMPLEX_UNIT_DIP, 50f, metrics); 67279000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertTrue(autoSizeTextViewUniform.getTextSize() < sizeSetInPixels); 67285b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu } 67295b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 67304f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver @Test 67319000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesUsingPredefinedSizes() { 6732cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu DisplayMetrics m = mActivity.getResources().getDisplayMetrics(); 67339000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 67349000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 673555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 673655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 10px, 10dp, 10sp, 10pt, 10in and 10mm. 6737cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // TypedValue can not use the math library and instead naively ceils the value by adding 6738cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // 0.5f when obtaining styled attributes. Check TypedValue#complexToDimensionPixelSize(...) 6739cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu int[] expectedSizesInPx = new int[] { 6740cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 10f, m)), 6741cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, m)), 6742cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10f, m)), 6743cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 10f, m)), 6744cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 10f, m)), 6745cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10f, m))}; 6746cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu expectedSizesInPx = Arrays.stream(expectedSizesInPx) 674755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .filter(x -> x > 0) 674855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .distinct() 674955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .sorted() 675055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .toArray(); 6751cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertArrayEquals(expectedSizesInPx, 6752cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 675355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 675455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu boolean containsValueFromExpectedSizes = false; 67559000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu int textSize = (int) autoSizeTextViewUniform.getTextSize(); 6756cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu for (int i = 0; i < expectedSizesInPx.length; i++) { 6757cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu if (expectedSizesInPx[i] == textSize) { 675855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu containsValueFromExpectedSizes = true; 675955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu break; 676055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 676155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 676255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(containsValueFromExpectedSizes); 676355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 676455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 676555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 67669000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesPredefinedSizesFiltering() { 67679000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 67689000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes_redundant_values); 676955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 677055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 40px, 10px, 10px, 10px, 0dp. 677155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] expectedSizes = new int[] {10, 40}; 67729000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(expectedSizes, autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 677355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 677455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 677555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 67769000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesFilteringAndSorting() throws Throwable { 677755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 677855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 677955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 678055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[] {400, 0, 10, 40, 10, 10, 0, 0}; 6781cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 6782cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 678355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 67849000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(new int[] {10, 40, 400}, mTextView.getAutoSizeTextAvailableSizes()); 678555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 678655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 678755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test(expected = NullPointerException.class) 67889000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesNullArray() throws Throwable { 678955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 679055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 679155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 679255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = null; 6793cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 6794cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 679555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 679655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 679755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 679855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 67999000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesEmptyArray() throws Throwable { 680055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 680155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 680255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 680355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 6804cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 680555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 680655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 68079000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] defaultSizes = mTextView.getAutoSizeTextAvailableSizes(); 680855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 680955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(defaultSizes.length > 0); 681055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 681155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[0]; 6812cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 6813cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 681455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 681555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 68169000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] newSizes = mTextView.getAutoSizeTextAvailableSizes(); 681755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 681855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals(defaultSizes, newSizes); 681955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 682055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 682155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 68229000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_buildsSizes() throws Throwable { 68239000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 68249000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 682555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 682655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // Verify that the interval limits are both included. 6827cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 6828cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration(10, 20, 2, 6829cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 683055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 683155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 683255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 68339000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 683455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 6835cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 6836cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 6837cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 6838cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 19, 6839cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 6840cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 684155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 684255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 684355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18}, 68449000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 684555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 6846cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 6847cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 6848cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 6849cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 21, 6850cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 6851cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 685255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 685355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 685455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 68559000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 685655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 685755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 685855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 68599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeTextDefaults() { 68604f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver final TextView textView = new TextView(mActivity); 6861771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 6862771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max/Granularity values for auto-sizing are 0 because they are not used. 6863cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 6864cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 6865cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 6866771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6867cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 68689000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6869771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max default values for auto-sizing XY have been loaded. 6870771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 6871771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 687255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(0 < minSize); 6873771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue(minSize < maxSize); 687455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotEquals(0, textView.getAutoSizeStepGranularity()); 6875771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6876cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE); 6877771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 6878771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max values for auto-sizing XY have been cleared. 6879cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 6880cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 6881cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 6882771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6883771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6884771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 68859000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeStepGranularity() { 6886771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6887771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 6888cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final int initialValue = -1; 6889771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(initialValue, textView.getAutoSizeStepGranularity()); 68904f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 6891cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 68929000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6893771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int defaultValue = 1; // 1px. 68949000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // If the auto-size type is AUTO_SIZE_TEXT_TYPE_UNIFORM then it means textView went through 68959000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // the auto-size setup and given that 0 is an invalid value it changed it to the default. 6896771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(defaultValue, textView.getAutoSizeStepGranularity()); 6897771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6898771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newValue = 33; 6899cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6900cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 6901cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 6902cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newValue, 6903cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 6904771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newValue, textView.getAutoSizeStepGranularity()); 6905771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6906771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6907771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 69089000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMinTextSize() { 6909771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6910cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 69119000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6912771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 6913771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 6914771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 6915771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 6916771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6917771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // This is just a test check to verify the next assertions. If this fails it is a problem 6918771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // of this test setup (we need at least 2 units). 6919771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue((maxSize - minSize) > 1); 6920771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMinSize = maxSize - 1; 6921cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6922cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 6923cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 6924cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 6925cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 6926cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6927771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMinSize, textView.getAutoSizeMinTextSize()); 6928771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Max size has not changed. 6929771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(maxSize, textView.getAutoSizeMaxTextSize()); 6930771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6931cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6932cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 6933cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize + 10, 6934cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 6935cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 6936cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6937771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the min size, the getter always 6938771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 6939771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMinSize, 6940771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivity.getResources().getDisplayMetrics()), textView.getAutoSizeMinTextSize()); 6941771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6942771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6943cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 69449000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_throwsException_whenMaxLessThanMin() { 6945771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6946cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6947cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 9, 1, TypedValue.COMPLEX_UNIT_SP); 6948cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 6949cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6950cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 6951cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_minLessThanZero() { 6952cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6953cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6954cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu -1, 9, 1, TypedValue.COMPLEX_UNIT_SP); 6955cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 6956cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6957cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 6958cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_maxLessThanZero() { 6959cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6960cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6961cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, -1, 1, TypedValue.COMPLEX_UNIT_SP); 6962cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 6963cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6964cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 6965cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_granularityLessThanZero() { 6966cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6967cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6968cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 20, -1, TypedValue.COMPLEX_UNIT_SP); 6969771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6970771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6971771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 69729000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMaxTextSize() { 6973771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6974cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 69759000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6976771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 6977771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 6978771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 6979771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 6980771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6981771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMaxSize = maxSize + 11; 6982cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6983cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 6984cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 6985cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 6986cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 6987cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 6988771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMaxSize, textView.getAutoSizeMaxTextSize()); 6989771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min size has not changed. 6990771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(minSize, textView.getAutoSizeMinTextSize()); 6991cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 6992cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 6993cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 6994cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 6995cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 6996771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the max size, the getter always 6997771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 6998771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMaxSize, 6999771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivity.getResources().getDisplayMetrics()), textView.getAutoSizeMaxTextSize()); 70004f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver } 70014f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7002771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 70039000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_autoSizeCalledWhenTypeChanged() throws Throwable { 7004771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 7005771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Make sure we pick an already inflated non auto-sized text view. 7006771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 7007771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Set the text size to a very low value in order to prepare for auto-size. 7008771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int customTextSize = 3; 7009771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7010771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, customTextSize)); 7011771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7012771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(customTextSize, mTextView.getTextSize(), 0f); 7013771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7014cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 7015771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7016771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // The size of the text should have changed. 7017771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(customTextSize, mTextView.getTextSize(), 0f); 7018771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 70194f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7020ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki @Test 7021ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki public void testSmartSelection() throws Throwable { 7022ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView = findTextView(R.id.textview_text); 7023ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 7024ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int startIndex = text.indexOf("president"); 7025ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int endIndex = startIndex + "president".length(); 702609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 7027ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 702809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 7029ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 703009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 703109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 703209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 7033ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // TODO: Test the floating toolbar content. 7034ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 703509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 703609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 703709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_dragSelection() throws Throwable { 703809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 703909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 704009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("is coming to town"); 704109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "is coming to town".length(); 704209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 704309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 704409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point start = getCenterPositionOfTextAt(mTextView, startIndex, startIndex); 704509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point end = getCenterPositionOfTextAt(mTextView, endIndex, endIndex); 704609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int[] viewOnScreenXY = new int[2]; 704709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.getLocationOnScreen(viewOnScreenXY); 704809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startX = start.x + viewOnScreenXY[0]; 704909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startY = start.y + viewOnScreenXY[1]; 705009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int offsetX = end.x - start.x; 705109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 705209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Perform drag selection. 705309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressAndDragGesture( 705409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mInstrumentation, startX, startY, offsetX, 0 /* offsetY */); 705509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 705609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // No smart selection on drag selection. 705709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(startIndex, mTextView.getSelectionStart()); 705809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(endIndex, mTextView.getSelectionEnd()); 705909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 706009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 706109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 706209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_resetSelection() throws Throwable { 706309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 706409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 706509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("president"); 706609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "president".length(); 706709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 706809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 706909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 707009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 707109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 707209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 707309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 707409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 707509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Click to reset selection. Expect selection of original selection. 707609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 707709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == startIndex 707809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == endIndex); 707909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 708009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Click one more time to dismiss the selection. 708109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 708209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertFalse(mTextView.hasSelection()); 708309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 708409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 70851f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 70861f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlFamilyName() { 70871f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_fontfamily); 70881f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 70891f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 70901f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 70911f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 70921f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 70931f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 70941f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlFamilyName() { 70951f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 70961f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 70971f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 70981f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 70991f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 71001f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71011f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 71021f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlStyle() { 71031f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_style); 71041f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 71051f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71061f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 71071f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 71081f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71091f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 71101f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlStyle() { 71111f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_style); 71121f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 71131f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71141f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 71151f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 71161f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71171f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 71181f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlTextAppearance() { 71191f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_textAppearance); 71201f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 71211f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71221f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 71231f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 71241f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71251f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 71262d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri public void testFontResourcesXml_setInXmlWithStyle() { 71272d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 71282d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 71292d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 71302d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 71312d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 71322d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_withStyle); 71332d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 71342d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface resultTypeface = mTextView.getTypeface(); 71352d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertNotEquals(resultTypeface, expected); 71362d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.create(expected, Typeface.ITALIC), resultTypeface); 71372d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.ITALIC, resultTypeface.getStyle()); 71382d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri } 71392d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 71402d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri @Test 71411f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlTextAppearance() { 71421f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_textAppearance); 71431f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 71441f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 71451f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 71461f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 7147ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 714809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void initializeTextForSmartSelection(CharSequence text) throws Throwable { 714909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertTrue(text.length() >= SMARTSELECT_END); 7150cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki initTextViewForTypingOnUiThread(); 715109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki TextClassifier mockClassifier = mock(TextClassifier.class); 715209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki when(mockClassifier.suggestSelection( 71535ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 715409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki .thenReturn(new TextSelection.Builder(SMARTSELECT_START, SMARTSELECT_END).build()); 715509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki when(mockClassifier.getTextClassificationResult( 71565ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 715709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki .thenReturn(new TextClassificationResult.Builder().build()); 7158cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mActivityRule.runOnUiThread(() -> { 7159cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setTextIsSelectable(true); 7160cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setText(text, BufferType.EDITABLE); 716109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.setTextClassifier(mockClassifier); 7162cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki }); 7163cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mInstrumentation.waitForIdleSync(); 716409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7165cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 716609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateClickOnView(View view, int offsetX, int offsetY) { 716709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateTapOnView(mInstrumentation, view, offsetX, offsetY); 716809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 716909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7170cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 717109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateLongPressOnView(View view, int offsetX, int offsetY) { 717209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressOnView(mInstrumentation, view, offsetX, offsetY); 717309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // TODO: Ideally, we shouldn't have to wait for a click timeout after a long-press but it 717409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // seems like we have a minor bug (call it inconvenience) in TextView that requires this. 717509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 7176cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki } 7177cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 71789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu /** 7179069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * Some TextView attributes require non-fixed width and/or layout height. This function removes 7180069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * all other existing views from the layout leaving only one auto-size TextView (for exercising 7181069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * the auto-size behavior) which has been set up to suit the test needs. 7182cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7183069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @param viewId The id of the view to prepare. 7184cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * @param shouldWrapLayoutContent Specifies if the layout params should wrap content 7185cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7186069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @return a TextView configured for auto size tests. 7187cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu */ 7188069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu private TextView prepareAndRetrieveAutoSizeTestData(final int viewId, 7189cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final boolean shouldWrapLayoutContent) throws Throwable { 7190cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7191cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 7192069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu TextView targetedTextView = (TextView) mActivity.findViewById(viewId); 7193cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu ll.removeAllViews(); 7194069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu ll.addView(targetedTextView); 7195cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu }); 7196cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7197cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7198069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById(viewId); 7199cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu if (shouldWrapLayoutContent) { 7200cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width or height. 7201cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7202cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7203cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 7204069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7205069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu textView.setLayoutParams(layoutParams); 7206069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu }); 7207cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7208cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7209cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7210069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu return textView; 7211cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7212cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7213cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu /** 72149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * Removes all existing views from the layout and adds a basic TextView (for exercising the 72159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * ClickableSpan onClick() behavior) in order to prevent scrolling. Adds a ClickableSpan to the 72169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * TextView and returns the ClickableSpan and position details about it to be used in individual 72179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * tests. 72189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu */ 72196b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu private ClickableSpanTestDetails prepareAndRetrieveClickableSpanDetails() throws Throwable { 72206b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 72219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 72229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.removeAllViews(); 72239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 72249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.addView(mTextView); 72259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 72269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 72279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mockTextLink = mock(ClickableSpan.class); 72299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu StringBuilder textViewContent = new StringBuilder(); 72309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu String clickableString = "clickMe!"; 72319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(clickableString); 72329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int startPos = 0; 72339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu // Insert more characters to make some room for swiping. 72359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu for (int i = 0; i < 200; i++) { 72369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(" text"); 72379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 72389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SpannableString spannableString = new SpannableString(textViewContent); 72399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int endPos = clickableString.length(); 72409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spannableString.setSpan(mockTextLink, startPos, endPos, 0); 72416b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 72429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(spannableString); 72439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 72449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 72459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 72469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu return new ClickableSpanTestDetails(mockTextLink, mTextView, startPos, endPos); 72489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 72499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private static final class ClickableSpanTestDetails { 72519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mClickableSpan; 72529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosInside; 72539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosInside; 72549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosOutside; 72559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosOutside; 72569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mStartCharPos; 72589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mEndCharPos; 72599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mParent; 72609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails(ClickableSpan clickableSpan, TextView parent, 72629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int startCharPos, int endCharPos) { 72639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mClickableSpan = clickableSpan; 72649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mParent = parent; 72659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mStartCharPos = startCharPos; 72669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mEndCharPos = endCharPos; 72679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu calculatePositions(); 72699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 72709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void calculatePositions() { 7272934d09af7f0bc700eeecb3091ab2ee4dad757476Keisuke Kuroyanagi int xStart = (int) mParent.getLayout().getPrimaryHorizontal(mStartCharPos, true, true); 7273934d09af7f0bc700eeecb3091ab2ee4dad757476Keisuke Kuroyanagi int xEnd = (int) mParent.getLayout().getPrimaryHorizontal(mEndCharPos, true, true); 72749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int line = mParent.getLayout().getLineForOffset(mEndCharPos); 72759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yTop = mParent.getLayout().getLineTop(line); 72769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yBottom = mParent.getLayout().getLineBottom(line); 72779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 72789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosInside = (xStart + xEnd) / 2; 72799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosInside = (yTop + yBottom) / 2; 72809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosOutside = xEnd + 1; 72819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosOutside = yBottom + 1; 72829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 72839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 72849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 728557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri private MotionEvent createMouseHoverEvent(View view) { 728657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] xy = new int[2]; 728757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri view.getLocationOnScreen(xy); 728857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewWidth = view.getWidth(); 728957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewHeight = view.getHeight(); 729057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float x = xy[0] + viewWidth / 2.0f; 729157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float y = xy[1] + viewHeight / 2.0f; 729257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri long eventTime = SystemClock.uptimeMillis(); 729357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 729457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0] = new MotionEvent.PointerCoords(); 729557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].x = x; 729657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].y = y; 729757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] pointerIds = new int[1]; 729857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerIds[0] = 0; 729957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri return MotionEvent.obtain(0, eventTime, MotionEvent.ACTION_HOVER_MOVE, 1, pointerIds, 730057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords, 0, 0, 0, 0, 0, InputDevice.SOURCE_MOUSE, 0); 730157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 730257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 73039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final TextView textView) throws Throwable { 73049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(textView)); 7305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final int layoutId) throws Throwable { 73099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layoutId)); 7310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView findTextView(int id) { 7314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return (TextView) mActivity.findViewById(id); 7315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private int getAutoLinkMask(int id) { 7318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return findTextView(id).getAutoLinkMask(); 7319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxLines(final int lines) throws Throwable { 73229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxLines(lines)); 73236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 73246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 73256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 73269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxWidth(final int pixels) throws Throwable { 73279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxWidth(pixels)); 7328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinWidth(final int pixels) throws Throwable { 73329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinWidth(pixels)); 7333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxHeight(final int pixels) throws Throwable { 73379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxHeight(pixels)); 7338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinHeight(final int pixels) throws Throwable { 73429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinHeight(pixels)); 7343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinLines(final int minLines) throws Throwable { 73479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinLines(minLines)); 7348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And 7353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * the buffer type is fixed to SPANNABLE. 7354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * 7355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param tv the text view 7356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param content the content 7357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 73589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setSpannableText(final TextView tv, final String content) throws Throwable { 73599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> tv.setText(content, BufferType.SPANNABLE)); 7360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73634b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLines(final int lines) throws Throwable { 73649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLines(lines)); 7365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73684b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHorizontallyScrolling(final boolean whether) throws Throwable { 73699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHorizontallyScrolling(whether)); 7370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73734b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setWidth(final int pixels) throws Throwable { 73749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setWidth(pixels)); 7375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73784b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHeight(final int pixels) throws Throwable { 73799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHeight(pixels)); 7380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73834b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMinEms(final int ems) throws Throwable { 73849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinEms(ems)); 7385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73884b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMaxEms(final int ems) throws Throwable { 73899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxEms(ems)); 7390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setEms(final int ems) throws Throwable { 73949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setEms(ems)); 7395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 73984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLineSpacing(final float add, final float mult) throws Throwable { 73999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLineSpacing(add, mult)); 7400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7403ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki /** 7404ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * Returns the x, y coordinates of text at a specified indices relative to the position of the 7405ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * TextView. 7406ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * 7407ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param textView 7408ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param startIndex start index of the text in the textView 7409ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param endIndex end index of the text in the textView 7410ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki */ 7411ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki private static Point getCenterPositionOfTextAt( 7412ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki TextView textView, int startIndex, int endIndex) { 7413ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int xStart = (int) textView.getLayout().getPrimaryHorizontal(startIndex, true, true); 7414ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int xEnd = (int) textView.getLayout().getPrimaryHorizontal(endIndex, true, true); 7415ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int line = textView.getLayout().getLineForOffset(endIndex); 7416ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yTop = textView.getLayout().getLineTop(line); 7417ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yBottom = textView.getLayout().getLineBottom(line); 7418ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7419ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki return new Point((xStart + xEnd) / 2 /* x */, (yTop + yBottom) / 2 /* y */); 7420ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 7421ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestSelectedRunnable implements Runnable { 7423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected1; 7425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected2; 7426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestSelectedRunnable(TextView textview) { 7428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected1() { 7432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected1; 7433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected2() { 7436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected2; 7437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected1() { 7440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected1 = mTextView.isSelected(); 7441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected2() { 7444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected2 = mTextView.isSelected(); 7445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestLayoutRunnable implements Runnable { 7449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Layout mLayout; 7451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestLayoutRunnable(TextView textview) { 7453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public Layout getLayout() { 7457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mLayout; 7458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveLayout() { 7461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mLayout = mTextView.getLayout(); 7462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static class MockTextWatcher implements TextWatcher { 7466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledAfterTextChanged; 7467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledBeforeTextChanged; 7468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasOnTextChanged; 7469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void reset(){ 7471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = false; 7472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = false; 7473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = false; 7474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledAfterTextChanged() { 7477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledAfterTextChanged; 7478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledBeforeTextChanged() { 7481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledBeforeTextChanged; 7482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledOnTextChanged() { 7485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasOnTextChanged; 7486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void afterTextChanged(Editable s) { 7489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = true; 7490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = true; 7494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void onTextChanged(CharSequence s, int start, int before, int count) { 7497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = true; 7498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7502277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook * A TextWatcher that converts the text to spaces whenever the text changes. 7503277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook */ 7504277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook private static class ConvertToSpacesTextWatcher implements TextWatcher { 7505277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook boolean mChangingText; 7506277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7507277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7508277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7509277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7510277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7511277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7512277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void onTextChanged(CharSequence s, int start, int before, int count) { 7513277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7514277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7515277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7516277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void afterTextChanged(Editable s) { 7517277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Avoid infinite recursion. 7518277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook if (mChangingText) { 7519277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook return; 7520277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7521277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = true; 7522277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Create a string of s.length() spaces. 7523277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook StringBuilder builder = new StringBuilder(s.length()); 7524277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook for (int i = 0; i < s.length(); i++) { 7525277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook builder.append(' '); 7526277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7527277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook s.replace(0, s.length(), builder.toString()); 7528277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = false; 7529277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7530277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su} 7532