TextViewTest.java revision 5a5227c68646efad8cd667a16ec41011415d4be6
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 45ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport static java.lang.annotation.RetentionPolicy.SOURCE; 46ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 47ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport android.annotation.IntDef; 48fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity; 49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation; 50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor; 51354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.content.Context; 52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent; 532751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager; 54fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList; 55938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.content.res.Resources; 56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException; 57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color; 58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint; 59afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path; 609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.graphics.Point; 61fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff; 62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect; 63afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF; 64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface; 65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable; 66ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable; 67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable; 68a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournaderimport android.icu.lang.UCharacter; 69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri; 70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle; 71354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Handler; 72265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList; 73354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Looper; 745b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable; 75354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.ResultReceiver; 7657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.os.SystemClock; 77a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.InstrumentationRegistry; 78a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.annotation.UiThreadTest; 793763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.MediumTest; 803763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.SmallTest; 81a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.rule.ActivityTestRule; 82a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.runner.AndroidJUnit4; 83fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable; 84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter; 85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType; 86fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout; 87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection; 88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable; 89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString; 90ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned; 91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint; 92fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils; 93fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt; 94afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher; 95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod; 96fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener; 97fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener; 98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener; 99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener; 100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener; 101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod; 102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod; 103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod; 104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener; 105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod; 106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener; 107afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize; 108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener; 109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod; 11057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.text.style.ClickableSpan; 11198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan; 112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan; 113ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan; 114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify; 115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics; 1169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.util.SparseArray; 117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue; 118ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode; 119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu; 120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity; 12157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.InputDevice; 122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent; 1235705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarriimport android.view.LayoutInflater; 12432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu; 12557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.MotionEvent; 12657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.PointerIcon; 127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View; 1289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewConfiguration; 129afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup; 1309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewGroup.LayoutParams; 13132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo; 13272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection; 13318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinirimport android.view.inputmethod.CompletionInfo; 13471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagiimport android.view.inputmethod.CorrectionInfo; 13572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo; 13672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText; 13772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest; 138c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection; 139354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.view.inputmethod.InputMethodManager; 1400ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Tokiimport android.view.textclassifier.TextClassification; 141ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextClassifier; 142ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextSelection; 143c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText; 144bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout; 14562808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout; 146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller; 147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView; 148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType; 149938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.widget.cts.util.TestUtils; 150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1519259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsKeyEventUtil; 1529259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsTouchUtils; 1539259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.PollingCheck; 1549259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.WidgetTestUtils; 1559259176007f5aad8fb9c79abb725b40c89327c40Aaron Holden 156a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Before; 157a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Rule; 158a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Test; 159a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.runner.RunWith; 160938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.invocation.InvocationOnMock; 161ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException; 162ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException; 164ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport java.lang.annotation.Retention; 16555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanuimport java.util.Arrays; 166b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale; 167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/** 169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}. 170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 171a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@MediumTest 172a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@RunWith(AndroidJUnit4.class) 173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovpublic class TextViewTest { 174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Instrumentation mInstrumentation; 175a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private Activity mActivity; 176a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private TextView mTextView; 1779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mSecondTextView; 178a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final String LONG_TEXT = "This is a really long string which exceeds " 1807375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "the width of the view. New devices have a much larger screen which " 1817375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "actually enables long strings to be displayed with no fading. " 1827375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "I have made this string longer to fix this case. If you are correcting " 1837375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "this text, I would love to see the kind of devices you guys now use!"; 184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final long TIMEOUT = 5000; 18509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 18609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_START = 0; 18709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_END = 40; 18809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int CLICK_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 50; 18909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 19022d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root private CharSequence mTransformedText; 191354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private Handler mHandler = new Handler(Looper.getMainLooper()); 192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 193a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Rule 194a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public ActivityTestRule<TextViewCtsActivity> mActivityRule = 195a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov new ActivityTestRule<>(TextViewCtsActivity.class); 196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 197a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Before 198a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public void setup() { 199a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation = InstrumentationRegistry.getInstrumentation(); 200a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mActivity = mActivityRule.getActivity(); 201b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mActivity::hasWindowFocus); 202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 20428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook /** 2056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Promotes the TextView to editable and places focus in it to allow simulated typing. Used in 206a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov * test methods annotated with {@link UiThreadTest}. 20728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook */ 20828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook private void initTextViewForTyping() { 2096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 2116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 2126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 213ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // Disable smart selection 214ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 2156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu } 2166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 2176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu /** 2186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Used in test methods that can not entirely be run on the UiThread (e.g: tests that need to 2196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * emulate touches and/or key presses). 2206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu */ 2214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void initTextViewForTypingOnUiThread() throws Throwable { 2224b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(this::initTextViewForTyping); 22328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mInstrumentation.waitForIdleSync(); 22428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 22528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 226047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @UiThreadTest 227a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 228047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOnUiThread() { 229047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 230047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 232047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @Test 233047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOffUiThread() { 234047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 235047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 237047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu private void verifyConstructor() { 238047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity); 239047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity, null); 240938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, android.R.attr.textViewStyle); 241f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_TextView); 242f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_TextView); 243f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_TextView); 244938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_Light_TextView); 245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 248a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessText() { 250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String expected = mActivity.getResources().getString(R.string.text_view_hello); 253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(expected); 254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, tv.getText().toString()); 255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null); 257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 261a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineHeight() { 263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(1.2f, 1.5f); 267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 270a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLayout() throws Throwable { 2729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 2736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER); 275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) { 280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the text of TextView. 282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello, Android!"); 283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveLayout(); 284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 2869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(runnable.getLayout()); 289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 292a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessKeyListener() throws Throwable { 2949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getKeyListener()); 298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final KeyListener digitsKeyListener = DigitsKeyListener.getInstance(); 300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(digitsKeyListener)); 302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(digitsKeyListener, mTextView.getKeyListener()); 304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 3079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(qwertyKeyListener)); 308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(qwertyKeyListener, mTextView.getKeyListener()); 310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 312a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMovementMethod() throws Throwable { 314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified " 315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "coordinates, except constrains the X scrolling position to the horizontal " 316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "regions of the text that will be visible after scrolling to " 317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "the specified Y position."; 318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionStart = 10; 319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionEnd = LONG_TEXT.length(); 320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance(); 3219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 3236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(movementMethod); 3246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(LONG_TEXT, BufferType.EDITABLE); 3256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(movementMethod, mTextView.getMovementMethod()); 332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 334b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 335b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection has been removed. 337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText())); 339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(null); 3426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 351b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 352b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection will not be changed. 354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 359a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testLength() { 361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is content"; 364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content); 365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.length()); 366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(""); 368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 375a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessGravity() { 377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_gravity); 378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_default); 3804bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_bottom); 3834bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity()); 384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_right); 386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center); 389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_fill); 392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center_vertical_right); 395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity()); 396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity()); 399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL); 400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.NO_GRAVITY); 4054bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL_VERTICAL); 4114bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity()); 412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //test negative input value. 414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(-1); 415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getGravity()); 416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 418ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 419ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef({EditorInfo.IME_ACTION_UNSPECIFIED, EditorInfo.IME_ACTION_NONE, 420ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_SEND, 421ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, EditorInfo.IME_ACTION_DONE, EditorInfo.IME_ACTION_PREVIOUS}) 422ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionAction {} 423ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 424ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 425ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef(flag = true, 426ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa value = {EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING, 427ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN, EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS, 428ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT, EditorInfo.IME_FLAG_NO_EXTRACT_UI, 429ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION, EditorInfo.IME_FLAG_NO_ENTER_ACTION, 430ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII}) 431ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionFlags {} 432ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 433ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private static void assertImeOptions(TextView textView, 434ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionAction int expectedImeOptionAction, 435ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionFlags int expectedImeOptionFlags) { 436ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualAction = textView.getImeOptions() & EditorInfo.IME_MASK_ACTION; 437ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualFlags = textView.getImeOptions() & ~EditorInfo.IME_MASK_ACTION; 438ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionAction, actualAction); 439ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionFlags, actualFlags); 440ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 441ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 442ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @UiThreadTest 443ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Test 444ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa public void testImeOptions() { 445ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.setContentView(R.layout.textview_imeoptions); 446ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 447ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test "normal" to be a synonym EditorInfo.IME_NULL 448ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(EditorInfo.IME_NULL, 449ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.<TextView>findViewById(R.id.textview_imeoption_normal).getImeOptions()); 450ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 451ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_ACTION_* 452ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 453ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_unspecified), 454ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 0); 455ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 456ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_none), 457ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NONE, 0); 458ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 459ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_go), 460ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 0); 461ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 462ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_search), 463ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEARCH, 0); 464ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 465ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_send), 466ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEND, 0); 467ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 468ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_next), 469ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, 0); 470ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 471ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_done), 472ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_DONE, 0); 473ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 474ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_previous), 475ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_PREVIOUS, 0); 476ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 477ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_FLAG_* 478ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 479ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_personalized_learning), 480ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 481ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING); 482ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 483ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_fullscreen), 484ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 485ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN); 486ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 487ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_previous), 488ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 489ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS); 490ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 491ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_next), 492ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 493ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT); 494ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 495ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_extract_ui), 496ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 497ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_EXTRACT_UI); 498ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 499ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_accessory_action), 500ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 501ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION); 502ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 503ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_enter_action), 504ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 505ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ENTER_ACTION); 506ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 507ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_force_ascii), 508ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 509ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII); 510ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 511ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // test action + multiple flags 512ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 513ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById( 514ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa R.id.textview_imeoption_action_go_nagivate_next_no_extract_ui_force_ascii), 515ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 516ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI 517ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa | EditorInfo.IME_FLAG_FORCE_ASCII); 518ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 519ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 520a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessAutoLinkMask() throws Throwable { 522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text1 = 524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("URL: http://www.google.com. mailto: account@gmail.com"); 5259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.ALL); 5276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text1, BufferType.EDITABLE); 528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, mTextView.getAutoLinkMask()); 531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Spannable spanString = (Spannable) mTextView.getText(); 533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("http://www.google.com", spans[0].getURL()); 537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("mailto:account@gmail.com", spans[1].getURL()); 538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text2 = 540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("name: Jack. tel: +41 44 800 8999"); 5419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 5436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text2, BufferType.EDITABLE); 544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask()); 547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spanString = (Spannable) mTextView.getText(); 549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("tel:+41448008999", spans[0].getURL()); 553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_autolink); 555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone) 556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, getAutoLinkMask(R.id.autolink_default)); 557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web)); 558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email)); 559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone)); 560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all)); 561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES, 562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound1)); 563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, 564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound2)); 565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS, 566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound3)); 567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL, 568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound4)); 569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 572a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextSize() { 574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f); 578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics), 579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f); 582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics), 583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextSize by default unit "sp" 590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(20f); 591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(200f); 595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics), 596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 600a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextColor() { 602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.GREEN); 605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentTextColor()); 606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors()); 607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.BLACK); 609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors()); 611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.RED); 613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentTextColor()); 614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors()); 615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(colors); 622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getTextColors()); 623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(null); 628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should thrown exception if the colors is null"); 629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e){ 630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 633a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 634325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette public void testGetTextColor() { 635325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette // TODO: How to get a suitable TypedArray to test this method. 636325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 637325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette try { 638325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette TextView.getTextColor(mActivity, null, -1); 639325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette fail("There should be a NullPointerException thrown out."); 640325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } catch (NullPointerException e) { 641325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 642325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 643325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 644a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6454b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessHighlightColor() throws Throwable { 646354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 647354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 649354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setTextIsSelectable(true); 650354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setText("abcd", BufferType.EDITABLE); 651354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setHighlightColor(Color.BLUE); 652354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov }); 653354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 654354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 655354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(textView.isTextSelectable()); 656354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.BLUE, textView.getHighlightColor()); 657354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 658354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Long click on the text selects all text and shows selection handlers. The view has an 659354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // attribute layout_width="wrap_content", so clicked location (the center of the view) 660354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // should be on the text. 6619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, textView); 662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 663354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // At this point the entire content of our TextView should be selected and highlighted 664354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // with blue. Now change the highlight to red while the selection is still on. 6659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.RED)); 666354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 667354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 668354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.RED, textView.getHighlightColor()); 669354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 670354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 671354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Remove the selection 6729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) textView.getText())); 673354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 674354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 675354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And switch highlight to green after the selection has been removed 6769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.GREEN)); 677354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 678354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 679354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.GREEN, textView.getHighlightColor()); 680354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 682fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 684a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetShadowLayer() { 6866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test values 6876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final MockTextView mockTextView = new MockTextView(mActivity); 6886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 6896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.4f, Color.CYAN); 6906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(Color.CYAN, mockTextView.getShadowColor()); 691a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.3f, mockTextView.getShadowDx(), 0.0f); 692a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.4f, mockTextView.getShadowDy(), 0.0f); 693a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mockTextView.getShadowRadius(), 0.0f); 694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the left and below the text 6966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN); 6976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 6986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 6996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getRightPaddingOffset()); 7016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getBottomPaddingOffset()); 702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the right and above the text 7046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN); 7056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 7066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getLeftPaddingOffset()); 7076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getTopPaddingOffset()); 7086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // no shadow 7126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN); 7136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(mockTextView.isPaddingOffsetRequired()); 7146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 7156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 721a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSelectAllOnFocus() { 723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_selectallonfocus); 724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is the content"; 725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String blank = ""; 726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.selectAllOnFocus_default); 727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content, BufferType.SPANNABLE); 738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.getSelectionEnd()); 747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(blank.length(), mTextView.getSelectionEnd()); 769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 783a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetPaint() { 785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextPaint tp = mTextView.getPaint(); 787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(tp); 788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaintFlags(), tp.getFlags()); 790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 793a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinksClickable() { 795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_true); 801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_false); 804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(false); 807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(true); 810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999"); 815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Movement method will be automatically set to LinkMovementMethod 820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod); 821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 824a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHintTextColor() { 826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using int values 828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.GREEN); 830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor()); 831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors()); 832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.BLUE); 834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors()); 835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor()); 836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.RED); 838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors()); 839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentHintTextColor()); 840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(colors); 847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getHintTextColors()); 848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor()); 849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(null); 852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHintTextColors()); 853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor()); 854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 857a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinkTextColor() { 859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.GRAY); 862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors()); 863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GRAY, mTextView.getPaint().linkColor); 864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.YELLOW); 866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors()); 867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.YELLOW, mTextView.getPaint().linkColor); 868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.WHITE); 870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors()); 871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.WHITE, mTextView.getPaint().linkColor); 872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_expanded}, new int[0] }, 875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(colors); 877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getLinkTextColors()); 878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(null); 881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLinkTextColors()); 882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 886a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessPaintFlags() { 888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 88953959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG 89053959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags()); 891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG); 893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG, 894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG); 897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG, 898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 901a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9024b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testHeight() throws Throwable { 903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 9046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalHeight = mTextView.getHeight(); 905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMaxHeight 9076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newHeight = originalHeight + 1; 9086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 9146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = Integer.MAX_VALUE; 9236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMinHeight 9286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 9306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // reset min and max height 944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(0); 945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setHeight 9486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight); 967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMaxHeight()); 9696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMinHeight()); 970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting max/min lines should cause getMaxHeight/getMinHeight to return -1 9726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxLines(2); 9736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting maxLines should return -1 fir maxHeight", 9746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMaxHeight()); 9756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinLines(1); 9776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting minLines should return -1 for minHeight", 9786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMinHeight()); 9796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 9806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 981a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testWidth() throws Throwable { 9836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = findTextView(R.id.textview_text); 9846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int originalWidth = mTextView.getWidth(); 9856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newWidth = mTextView.getWidth() / 8; 9876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 9886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 9896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 9906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Min Width 9936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 9946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(newWidth); 995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 9976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 1000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth - 1); 10019c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Width 10066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 10076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 10146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 10159c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 10196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting ems should cause getMaxWidth/getMinWidth to return -1 10216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setEms(1); 10226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMaxWidth()); 10236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMinWidth()); 1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1026a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMinEms() throws Throwable { 1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10309c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu 10316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms + 1); 1035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 103698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 103798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms - 1); 1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 104198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 104298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 10436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(1); 10456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMinEms()); 1046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1047fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1048a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10494b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMaxEms() throws Throwable { 1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1051fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms + 1); 1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 105998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 106098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1062fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms - 1); 1063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 10646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 106598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 106698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 10676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxWidth(originalWidth); 10696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMaxEms()); 1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1072a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10734b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetEms() throws Throwable { 1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("check height", 1, mTextView.getLineCount()); 10766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms + 1); 1080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 108298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 108398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 108498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 108598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1086fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms - 1); 1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((1 < mTextView.getLineCount())); 10896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 109098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 109198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 109298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 109398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1096a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10974b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLineSpacing() throws Throwable { 10989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 10999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 1100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLineHeight = mTextView.getLineHeight(); 1101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float add = 1.2f; 1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float mult = 1.4f; 1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 110692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 0.0f; 1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 111092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // abnormal 1113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 111692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = -1.4f; 1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 112092e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 1.2f; 1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 0.0f; 1123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 112492e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // edge 1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MIN_VALUE; 1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MIN_VALUE; 1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1130ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1131ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette 1132ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // edge case where the behavior of Math.round() deviates from 1133ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // FastMath.round(), requiring us to use an explicit 0 value 1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MAX_VALUE; 1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MAX_VALUE; 1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1137ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(0, mTextView.getLineHeight()); 1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1140a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11414b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetElegantLineHeight() throws Throwable { 1142ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView = findTextView(R.id.textview_text); 1143ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 11449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 11466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 11476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 1148ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 1149ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1150ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1151ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien int oldHeight = mTextView.getHeight(); 11529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(true)); 1153ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1154ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1155ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getPaint().isElegantTextHeight()); 1156ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() > oldHeight); 1157ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 11589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(false)); 1159ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1160ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 1161ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() == oldHeight); 1162ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 1163ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1164a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFreezesText() throws Throwable { 1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_hint_linksclickable_freezestext); 1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_true); 1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(false); 1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = "Hello, TextView."; 11819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final URLSpan urlSpan = new URLSpan("ctstest://TextView/test"); 118572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1186a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov ActivityMonitor am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 11916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 11926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT); 1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(newActivity); 1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1198a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is removed. 1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 120172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 120272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(text.toString(), mTextView.getText().toString()); 1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(true); 1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 120972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1210a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 12146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 12156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 12166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 121907b9d3406e116f2f6b92932925783eed79503de0Mist Liao Activity oldActivity = newActivity; 122007b9d3406e116f2f6b92932925783eed79503de0Mist Liao while (true) { 122107b9d3406e116f2f6b92932925783eed79503de0Mist Liao newActivity = am.waitForActivityWithTimeout(TIMEOUT); 122207b9d3406e116f2f6b92932925783eed79503de0Mist Liao assertNotNull(newActivity); 122307b9d3406e116f2f6b92932925783eed79503de0Mist Liao if (newActivity != oldActivity) { 122407b9d3406e116f2f6b92932925783eed79503de0Mist Liao break; 122507b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 122607b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1228a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is still there. 1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.toString(), mTextView.getText().toString()); 1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1235a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEditableFactory() { 1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 124098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Editable.Factory mockEditableFactory = spy(new Editable.Factory()); 124198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockEditableFactory).newEditable(any(CharSequence.class)); 124298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setEditableFactory(mockEditableFactory); 124398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 124598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 124798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 124998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 125398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 125798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(DigitsKeyListener.getInstance()); 126098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 126298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEditableFactory(null); 1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1272a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSpannableFactory() { 1274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 127798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Spannable.Factory mockSpannableFactory = spy(new Spannable.Factory()); 127898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockSpannableFactory).newSpannable(any(CharSequence.class)); 127998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setSpannableFactory(mockSpannableFactory); 128098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 128298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 128698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 129098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 129298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 129498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 129798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 129998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSpannableFactory(null); 1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1309a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextChangedListener() { 1311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher0 = new MockTextWatcher(); 1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher1 = new MockTextWatcher(); 1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher0); 1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher1); 1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called though the strings are same 1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called twice (The text is not 1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Editable, so in Append() it calls setText() first) 1343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("and appended"); 1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Methods are not called if the string does not change 1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(""); 1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledBeforeTextChanged()); 1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledOnTextChanged()); 1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledAfterTextChanged()); 1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.removeTextChangedListener(watcher1); 1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1375a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetTextKeepState1() { 1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1); 1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, 4); 1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getSelectionEnd()); 1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1); 1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1425a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetEditableText() { 1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "Hello"; 1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.EDITABLE); 1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getEditableText().toString()); 1434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.SPANNABLE); 1436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.EDITABLE); 1441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getEditableText().toString()); 1444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.SPANNABLE); 1446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1452a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText2() { 1454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = "This is a test for setting text content by char array"; 1455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su char[] input = string.toCharArray(); 1456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, input.length); 1459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string, tv.getText().toString()); 1460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, 5); 1462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string.substring(0, 5), tv.getText().toString()); 1463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, -1, input.length); 1466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the start position is negative!"); 1467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, -1); 1472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the length is negative!"); 1473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, input.length); 1478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the end position is out of index!"); 1479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, 0); 1483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1487a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText1() { 1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), longString.length()); 1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1); 1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length() - 1, mTextView.getSelectionEnd()); 1539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length()); 1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1587a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText3() { 1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId); 1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1); 1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 1600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1604a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetTextUpdatesHeightAfterRemovingImageSpan() throws Throwable { 160698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // Height calculation had problems when TextView had width: match_parent 160798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT; 160898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final Spannable text = new SpannableString("some text"); 160998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int spanHeight = 100; 161098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 161198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // prepare TextView, width: MATCH_PARENT 16129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 16139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 16149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 16159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2); 16169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setPadding(0, 0, 0, 0); 16179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setIncludeFontPadding(false); 16189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 161998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 162098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth, 162198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 16229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 162398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.setLayoutParams(layoutParams); 16249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 1625a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 162698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 162798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height of text with no span 16289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithoutSpan = mTextView.getHeight(); 162998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be smaller than span height", 163098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan < spanHeight); 163198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 163298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // add ImageSpan to text 163398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery); 163498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir drawable.setBounds(0, 0, spanHeight, spanHeight); 163598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ImageSpan span = new ImageSpan(drawable); 163698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 16379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 163898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 163998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 164098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height with span 16419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithSpan = mTextView.getHeight(); 164298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be greater or equal than span height", 164398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithSpan >= spanHeight); 164498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 164598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // remove the span 164698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.removeSpan(span); 16479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 164898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 164998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 16509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightAfterRemoveSpan = mTextView.getHeight(); 165198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertEquals("Text height should be same after removing the span", 165298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan, heightAfterRemoveSpan); 165398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 165498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 1655a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16564b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRemoveSelectionWithSelectionHandles() throws Throwable { 16576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1658af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1659354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isTextSelectable()); 16609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 1661354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setTextIsSelectable(true); 1662354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setText("abcd", BufferType.EDITABLE); 1663af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1664af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1665354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isTextSelectable()); 1666af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1667af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Long click on the text selects all text and shows selection handlers. The view has an 1668af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // attribute layout_width="wrap_content", so clicked location (the center of the view) 1669af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // should be on the text. 16709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 1671af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 16729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) mTextView.getText())); 1673af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1674354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 1675354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", mTextView.getText())); 1676af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1677af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1678a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_insert() throws Throwable { 16806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 16815b51f77b99861d48fec1c327252416f726b3b01aJames Cook 16825b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text. 1683b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 16849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 16856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The cursor is at the end of the text. 16866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 16876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the typed string in one step. 16896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 16906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 16916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 16926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo restores the text and cursor position. 16946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 16956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 16966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 16976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo clears the text again. 16996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo when the undo stack is empty does nothing. 17036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17055b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17065b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 170728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17085b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1709a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 17104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_delete() throws Throwable { 17116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 17125b51f77b99861d48fec1c327252416f726b3b01aJames Cook 171328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Simulate deleting text and undoing it. 1714b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1715b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1716b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 17179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 17186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The text was actually deleted. 17196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo restores the typed string and cursor position in one step. 17236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo removes the text in one step. 17286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 17296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo restores the text again. 17336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing again undoes the original typing. 17386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17415b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17425b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 174328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17445b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1745c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Initialize the text view for simulated IME typing. Must be called on UI thread. 1746c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private InputConnection initTextViewForSimulatedIme() { 1747c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView = findTextView(R.id.textview_text); 174818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return initTextViewForSimulatedIme(mTextView); 174918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 175018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 175118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir private InputConnection initTextViewForSimulatedIme(TextView textView) { 175218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 175318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setText("", BufferType.EDITABLE); 175418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return textView.onCreateInputConnection(new EditorInfo()); 1755c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1756c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1757c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulates IME composing text behavior. 1758c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private void setComposingTextInBatch(InputConnection input, CharSequence text) { 1759c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1760c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText(text, 1); // Leave cursor at end. 1761c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1762c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1763c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1764c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1765a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1766c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertLatin() { 1767c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1768c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1769c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words, 1770c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // such as "c" -> "ca" -> "cat" -> "cat ". 1771c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "c"); 1772c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "ca"); 1773c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1774c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The completion and space are added in the same batch. 1775c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1776c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("cat", 1); 1777c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText(" ", 1); 1778c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1779c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1780c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements undo in a single step. 1781c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1782c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1783c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1784c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1785c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1786a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1787c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertJapanese() { 1788c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1789c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1790c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji. 1791c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1792c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String NA = "\u306A"; // HIRAGANA LETTER NA 1793c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1794c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1795c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1796c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + NA); 1797c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1798c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The result may be a surrogate pair. The composition ends in the same batch. 1799c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1800c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("\uD83C\uDF37", 1); // U+1F337 TULIP 1801c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText("", 1); 1802c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1803c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1804c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements are a single undo step. 1805c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1806c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1807c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1808c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1809c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1810a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 181171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeInsertAndDeleteLatin() { 181271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi InputConnection input = initTextViewForSimulatedIme(); 181371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 181471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 181571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 181671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 181771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "test"); 181871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 181971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 182071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 182171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 182271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 182371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.setComposingText("", 1); 182471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.finishComposingText(); 182571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 182671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 182771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 182871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("test", mTextView.getText().toString()); 182971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 183071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 183171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 183271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 183371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1834a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 183571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeAutoCorrection() { 183618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 183718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 183818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 183971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 184071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Start typing a composition. 184171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 184271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 184371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "teh"); 184471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 184518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CorrectionInfo correctionInfo = new CorrectionInfo(0, "teh", "the"); 184618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 184771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 184871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Auto correct "teh" to "the". 184918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCorrection(correctionInfo)); 185071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.commitText("the", 1); 185171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 185271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 185318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCorrection(refEq(correctionInfo)); 185418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 185518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("the", spiedTextView.getText().toString()); 185618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 185718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("teh", spiedTextView.getText().toString()); 185818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 185918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 186018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 186118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 186218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir @UiThreadTest 1863a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 186418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir public void testUndo_imeAutoCompletion() { 186518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 186618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 186718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 186818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 186918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Start typing a composition. 187018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "a"); 187118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "an"); 187218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "and"); 187318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 187418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CompletionInfo completionInfo = new CompletionInfo(0, 0, "android"); 187518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 187618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.beginBatchEdit(); 187718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Auto complete "and" to "android". 187818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCompletion(completionInfo)); 187918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.commitText("android", 1); 188018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.endBatchEdit(); 188118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 188218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCompletion(refEq(completionInfo)); 188318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 188418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("android", spiedTextView.getText().toString()); 188518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 188618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 188771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 188871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 188971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1890a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1891c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeCancel() { 1892c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1893c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1894c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1895c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Start typing a composition. 1896c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1897c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1898c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1899c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1900c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1901c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Cancel the composition. 1902c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, ""); 1903c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1904c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 190571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals(HA + "n" + "flower", mTextView.getText().toString()); 1906c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1907c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1908c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1909c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1910c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1911a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1912c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeEmptyBatch() { 1913c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1914c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1915c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1916c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Send an empty batch edit. This happens if the IME is hidden and shown. 1917c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1918c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1919c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1920c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1921c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1922c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1923c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1924c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1925c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1926c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1927a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_setText() throws Throwable { 19296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 193028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1931c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Create two undo operations, an insert and a delete. 1932b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1933b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1934b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 19359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears both undo operations, so undo doesn't happen. 19376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 19386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 19406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 19416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Clearing text programmatically does not undo either. 19426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 19436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1945277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1946277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1947277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 194828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1949a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19504b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRedo_setText() throws Throwable { 19516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1952277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1953277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. This creates an undo entry. 1954b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing to create a redo entry. 19576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 1958277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears the redo stack, so redo doesn't happen. 19606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 19616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 19626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 1963277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1964277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1965277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1966277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1967a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19684b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directAppend() throws Throwable { 19696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 197028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1971277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1972b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. 19756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("def"); 19766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abcdef", mTextView.getText().toString()); 1977277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the append as a separate step. 19796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 1981277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 19836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1985277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1986277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1987277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1988277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1989a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19904b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directInsert() throws Throwable { 19916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1992277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1993277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1994b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Directly modify the underlying Editable to insert some text. 19976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // NOTE: This is a violation of the API of getText() which specifies that the 19986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // returned object should not be modified. However, some apps do this anyway and 19996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // the framework needs to handle it. 20006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Editable text = (Editable) mTextView.getText(); 20016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu text.insert(0, "def"); 20026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("defabc", mTextView.getText().toString()); 20036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the insert as a separate step. 20056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 20096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2011277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2012277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2013277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 2014277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2016a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2017c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void testUndo_noCursor() { 2018c530472a02205f0b7d87f9f06140c56ca0849816James Cook initTextViewForTyping(); 2019c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Append some text to create an undo operation. There is no cursor present. 20216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("cat"); 2022c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Place the cursor at the end of the text so the undo will have to change it. 20246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 3); 2025c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the append. This should not crash, despite not having a valid cursor 20276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // position in the undo operation. 20286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 2029c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 2030c530472a02205f0b7d87f9f06140c56ca0849816James Cook 2031a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20324b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_textWatcher() throws Throwable { 20336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2034277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2035277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Add a TextWatcher that converts the text to spaces on each change. 2036277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2037277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2038277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 2039b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // TextWatcher altered the text. 20426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2043277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 20456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2047277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2048277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2049c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 2050c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2052a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2053c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void testUndo_textWatcherDirectAppend() { 2054c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook initTextViewForTyping(); 2055c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 2056c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Add a TextWatcher that converts the text to spaces on each change. 2057c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2058c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. The TextWatcher changes it to spaces. 20606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("abc"); 20616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2062c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 20646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 206628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 206728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 2068a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20694b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_shortcuts() throws Throwable { 20706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 207128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 207228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Type some text. 2073b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Z triggers undo. 20766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0, 20776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 20786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control)); 20796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 20806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Shift-Z triggers redo. 20826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 20836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON); 20846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift)); 20856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20865b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 20875b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 20885b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 20895b51f77b99861d48fec1c327252416f726b3b01aJames Cook 2090a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20914b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceState() throws Throwable { 20926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 20935b51f77b99861d48fec1c327252416f726b3b01aJames Cook 20945b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text to create an undo operation. 2095b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the TextView. 20986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 20996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21005b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21015b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21025b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21035b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Delete a character to create a new undo operation. 2104b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ab", mTextView.getText().toString()); 21075b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the delete. 21096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 21115b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing, which verifies that the original undo operation was parceled 21136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // correctly. 21146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21165f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the undo stack (which is empty but has been used and may 21186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // contain other state). 21196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21215f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21225f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21235f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 21245f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 2125a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21264b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceStateEmpty() throws Throwable { 21276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 21285f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21295f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Type and delete to create two new undo operations. 2130b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2131b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Empty the undo stack then parcel and unparcel the TextView. While the undo 21346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // stack contains no operations it may contain other state. 21356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21395f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21405f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21415f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21425f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Create two more undo operations. 2143b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2144b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Verify undo still works. 21476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("b", mTextView.getText().toString()); 21496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21515b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21525b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21535b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 21545b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2156a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2157b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCopyAndPaste() { 2158b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 21596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 21616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 21626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Copy "bc". 21646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 21656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 21666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "bc" between "b" and "c". 21686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 21696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abbccd", mTextView.getText().toString()); 21716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select entire text and paste "bc". 21736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 21746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bc", mTextView.getText().toString()); 2176b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2177b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2178a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCopyAndPaste_byKey() throws Throwable { 21806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 218149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 218249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2183b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 21849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 21866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 218749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 218849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 218949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Copy "bc" 2190b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_COPY); 219149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 21929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set cursor between 'b' and 'c'. 21946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 219549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 219649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 219749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2198b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 219949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("abbcc", mTextView.getText().toString()); 220049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 22046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON); 22056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + copy doesn't perform copy. 22066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcabbcc", mTextView.getText().toString()); 22106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 22146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + copy doesn't perform copy. 22156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcabbcc", mTextView.getText().toString()); 22196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 22236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + copy doesn't perform copy. 22246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcbcabbcc", mTextView.getText().toString()); 222849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 22298e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 223049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 223149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2233a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2234b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste() { 2235b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 22366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 22386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 22396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "bc". 22416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 22426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 22446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "ad". 22466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 2); 22476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 22496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "ad". 22516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 2253b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2254b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2255a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 22564b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCutAndPaste_byKey() throws Throwable { 22576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 225849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 225949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2260b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 22619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 22636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 226449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 226549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 226649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Cut "bc" 2267b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_CUT); 226849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("a", mTextView.getText().toString()); 22716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Move cursor to the head 22726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 227349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 227449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 227549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2276b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 227749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 227849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 22806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 22826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON); 22836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + cut doesn't perform cut. 22846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 22856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 22866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 22886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 22896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + cut doesn't perform cut. 22906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 22916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 22926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 22946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 22956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + cut doesn't perform cut. 22966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 22976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 229849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 22992de5a65a1540ec0b1ed03ec75c49ff9c242331baSiyamed Sinir mInstrumentation.waitForIdleSync(); 230049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 230149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 2302b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) { 2303b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable)textView.getText(); 2304b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final int at = spannable.length() / 2; 2305b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi return spannable.getSpans(at, at, type).length > 0; 2306b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2307b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 23086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2309a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2310b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste_withAndWithoutStyle() { 2311b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 23126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("example", BufferType.EDITABLE); 23146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 23156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set URLSpan. 23176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Spannable spannable = (Spannable) mTextView.getText(); 23186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0); 23196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut entire text. 23226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 23246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 23256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste without style. 23276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText); 23286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text doesn't have URLSpan. 23306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste with style. 23336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 23356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text has URLSpan. 23376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2338b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2339b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2341a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 23424ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien public void testSaveInstanceState() { 2343baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // should save text when freezesText=true 23444ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView originalTextView = new TextView(mActivity); 23454ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 23464ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setText(text); 23474ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setFreezesText(true); // needed to actually save state 23484ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien Parcelable state = originalTextView.onSaveInstanceState(); 23494ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23504ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView restoredTextView = new TextView(mActivity); 23514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien restoredTextView.onRestoreInstanceState(state); 23524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien assertEquals(text, restoredTextView.getText().toString()); 23534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 23544ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23554ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2356a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2357baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_whenFreezesTextIsFalse() { 23584ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 2359baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text when freezesText=false 2360baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2361baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2362baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2363baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 23644ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 2365baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2366baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2367baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2368baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2369baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2370baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2371baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2372baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2373baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2374baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text even when textIsSelectable=true 2375baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2376baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2377baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2378baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2379baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2380baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2381baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2382baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2383baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2384baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2385baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2386baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2387baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2388baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2389baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2390baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2391baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2392baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2393baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2394a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2395baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() { 2396baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2397baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2398baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2399baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2400baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2401baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2402baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2403baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2404baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2405baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2406baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2407baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2408baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionStart()); 2409baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionEnd()); 2410baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2411baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2412baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2413baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2414a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2415baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() { 2416baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2417baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2418baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2419baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2420baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2421baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2422baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2423baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2424baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2425baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2426baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2427baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2428baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2429baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2430baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2431baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2432baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir //when textIsSelectable, selection start and end are initialized to 0 2433baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionStart()); 2434baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionEnd()); 2435baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2436baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2437baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2438baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2439a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2440baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_savesSelectionWhenExists() { 2441baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2442baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2443baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2444baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2445baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2446baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2447baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2448baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2449baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2450baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2451baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2452baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2453baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2454baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2455baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2456baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart()); 2457baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd()); 24584ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 24594ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 24604ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2461a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText() { 2463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 2464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.EDITABLE); 2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.SPANNABLE); 2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1, BufferType.EDITABLE); 2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2484a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHint() { 2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 2487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHint()); 2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_blank); 2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getHint()); 2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_string); 2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint), 2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_resid); 2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hint), 2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint("This is hint"); 2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("This is hint", mTextView.getHint().toString()); 2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(R.string.text_view_hello); 2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint().toString()); 2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Non-exist resid 2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(-1); 2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if id is illegal"); 2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2517a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 25184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessError() throws Throwable { 2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 252253b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner final String errorText = "Oops! There is an error"; 2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null)); 2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2528a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable icon = TestUtils.getDrawable(mActivity, R.drawable.failed); 25299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(errorText, icon)); 2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // can not check whether the drawable is set correctly 2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null, null)); 2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance("")); 25406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 25426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2548b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event that will not change the TextView's text 2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getText().toString()); 2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // The icon and error message will not be reset to null 255253b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner assertEquals(errorText, mTextView.getError().toString()); 2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance()); 25566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 25586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2559300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu }); 2560300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mInstrumentation.waitForIdleSync(); 2561300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu 2562b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "1"); 2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event cause changes to the TextView's text 2564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("1", mTextView.getText().toString()); 2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the error message and icon will be cleared. 2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2569a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 25704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessFilters() throws Throwable { 2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final InputFilter[] expected = { new InputFilter.AllCaps(), 2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new InputFilter.LengthFilter(2) }; 2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 25769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 25786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 25796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFilters(expected); 25816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(expected, mTextView.getFilters()); 2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2587b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("A", mTextView.getText().toString()); 2590b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2593b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "c"); 2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 'C' could not be accepted, because there is a length filter. 2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(null); 2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw IllegalArgumentException!"); 2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IllegalArgumentException e) { 2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2604a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26054b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetFocusedRect() throws Throwable { 2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2608fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Basic 26099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2617fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Single line 2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 262688b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 262788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 262988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 3, 13); 2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 2634fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien /* Cursor coordinates from getPrimaryHorizontal() may have a fractional 2635fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * component, while the result of getFocusedRect is in int coordinates. 2636fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * It's not practical for these to match exactly, so we compare that the 2637fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * integer components match - there can be a fractional pixel 2638fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * discrepancy, which should be okay for all practical applications. */ 2639fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left); 2640fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right); 2641fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2642fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2643fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 264588b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 264688b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 264888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 13, 3); 2649fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2650fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2651fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2652fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2653fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left); 2654fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right); 2655fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2656fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2657fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2658fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Multi lines 2659fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView = findTextView(R.id.textview_text_two_lines); 2660fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2661fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX(), rc.left); 2662fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2663fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY(), rc.top); 2664fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2665fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 266788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 266888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 267088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 4); 2671fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2672fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2673fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2674fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2675fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left); 2676fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right); 2677fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2678fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2679fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 268188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 268288b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 268488b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir // cross the "\n" and two lines 268588b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 10); 2686fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2687fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2688fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2689fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Path path = new Path(); 2690fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getLayout().getSelectionPath(2, 10, path); 2691fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio RectF rcf = new RectF(); 2692fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio path.computeBounds(rcf, true); 2693fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2694a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.left - 1, (float) rc.left, 0.0f); 2695a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.right + 1, (float) rc.right, 0.0f); 2696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2697fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom); 2698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Exception 2700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(null); 2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2707a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetLineCount() throws Throwable { 27099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 27109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // this is an one line text with default setting. 2712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multi-lines 2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(mTextView.getWidth() / 3); 2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it to an one line 2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(Integer.MAX_VALUE); 2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set min lines don't effect the lines count for actual text. 2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(12); 2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the internal Layout has not been built. 2729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLayout()); 2730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineCount()); 2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2733a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27344b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLineBounds() throws Throwable { 2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 27369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, null)); 2739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, rc)); 2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.right); 2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.bottom); 2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null)); 2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth(), rc.right); 2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight(), rc.bottom); 2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingLeft(), rc.left); 2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right); 2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingTop(), rc.top); 2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom); 2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2767a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27684b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetBaseLine() throws Throwable { 27699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getBaseline()); 2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline()); 2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0); 2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getBaseline()); 2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2785a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testPressKey() throws Throwable { 27876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2789b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2791b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("ab", mTextView.getText().toString()); 2793b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2797a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2798aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky public void testKeyNavigation() throws Throwable { 2799aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky initTextViewForTypingOnUiThread(); 2800aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivityRule.runOnUiThread(() -> { 2801aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_singleLine).setFocusableInTouchMode(true); 2802aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_text_two_lines).setFocusableInTouchMode(true); 2803aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 2804aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setText("abc"); 2805aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setFocusableInTouchMode(true); 2806aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky }); 2807aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2808aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.requestFocus(); 2809aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2810aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2811aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2812aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Arrows should not cause focus to leave the textfield 2813aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP); 2814aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2815aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2816aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2817aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_DOWN); 2818aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2819aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2820aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2821aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Tab should 2822aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_TAB); 2823aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2824aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertFalse(mTextView.isFocused()); 2825aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky } 2826aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2827aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky @Test 28284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetIncludeFontPadding() throws Throwable { 2829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2830ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getIncludeFontPadding()); 28319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 28336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 28346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int oldHeight = mTextView.getHeight(); 28399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setIncludeFontPadding(false)); 2840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() < oldHeight); 2843ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getIncludeFontPadding()); 2844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 28469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2847a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testScroll() { 2849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //don't set the Scroller, nothing changed. 2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the Scroller 2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Scroller s = new Scroller(mActivity); 2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(s); 2862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.startScroll(0, 0, 320, 480, 0); 2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.abortAnimation(); 2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.forceFinished(false); 2865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setScroller(s); 2866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, mTextView.getScrollX()); 2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, mTextView.getScrollY()); 2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2872a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDebug() throws Throwable { 28749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 28769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.debug(0); 28779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("Hello!"); 28789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 28799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(mTextView); 2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(1); 2883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 28859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2886a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSelection() throws Throwable { 2888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "This is the content"; 2890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 2891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.selectAll((Spannable) mTextView.getText()); 2894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 2895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.length(), mTextView.getSelectionEnd()); 2896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionStart = 5; 2899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionEnd = 7; 2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart); 2901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionEnd()); 2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); 2906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, mTextView.getSelectionEnd()); 2908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2911a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testOnSelectionChangedIsTriggeredWhenSelectionChanges() throws Throwable { 29136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String text = "any text"; 29149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 29159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 29169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 29176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // assert that there is currently no selection 29199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(mTextView.hasSelection()); 29206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // select all 29229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 2923b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // After selectAll OnSelectionChanged should have been called 29249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(0, text.length()); 29256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // change selection 29289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 5); 29299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(1, 5); 29306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // clear selection 29339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.removeSelection((Spannable) mTextView.getText()); 29349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(-1, -1); 29356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 29366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 2937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2938a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessEllipsize() { 2940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_ellipsize); 2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_default); 2943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_none); 2946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_start); 2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.START, mTextView.getEllipsize()); 2950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_middle); 2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize()); 2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_end); 2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.END, mTextView.getEllipsize()); 2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); 2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize()); 2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.END); 2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize()); 2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(null); 2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(10); 2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord"); 2972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.invalidate(); 2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no method to check if '...yLongVeryLongWord' is painted in the screen. 2976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2978a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 297992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForSingleLine() throws Throwable { 298092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline or ellipsize set, single line text 298192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 298292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 298392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a"); 298492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 298592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with two lines 298692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 298792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(1); 298892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 298992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na"); 299092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 299192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with two lines 299292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 299392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 299492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(1); 299592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 299692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na"); 29972deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 299892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 299992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 300092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 300192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 300292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 300392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 300492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 300592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 300692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 300792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 300892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 300992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 30109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 30112deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 301292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 301392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 301492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 301592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 301692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 301792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(0)); 301892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 301992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 302092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(0)); 302192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 302292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 302392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir @Test 302492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForMultiLine() throws Throwable { 302592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, text with two lines 302692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 302792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 302892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a\na"); 302992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 303092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with three lines 303192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 303292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 303392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 303492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na\na"); 303592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 303692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with three lines 303792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 303892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 303992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 304092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 304192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na\na"); 30426031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 30432deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 30442deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 304592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 304692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 30472deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 304892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 304992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 305092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 305192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 305292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 305392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 305492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 305592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3056a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 30572deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 305892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 305992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 306092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 306192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 306292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) { 306392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 306492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 306592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(i)); 306692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 306792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 306892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 306992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(i)); 307092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 30712deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 30722deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 3073a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 307492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForHint() throws Throwable { 307592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with two lines 307692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvTwoLines = new TextView(mActivity); 307792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setLineSpacing(0, 1.5f); 307892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setHint("a\na"); 30792deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 308092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with three lines 308192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvThreeLines = new TextView(mActivity); 308292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setLineSpacing(0, 1.5f); 308392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setHint("a\na\na"); 308492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 308592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, hint with three lines 308692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 308792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 308892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 308992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 309092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setHint("a\na\na"); 30912deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 309292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, hint with three lines 309392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 309492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 309592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 309692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setHint("a\na\na"); 30976031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 30982deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 30992deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 310092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 310192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 31022deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 310392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvTwoLines, layoutParams); 310492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 310592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 310692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvThreeLines, layoutParams); 31072deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 310892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 310992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 311092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 311192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3112a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 31132deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 311492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Non-ellipsized hint should not crop text at maxLines", 311592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.getHeight(), tvEllipsizeNone.getHeight()); 311692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 311792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Ellipsized hint should crop text at maxLines", 311892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.getHeight(), tvEllipsizeEnd.getHeight()); 31192deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 31202deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 31219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3122a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3123354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void testAccessCursorVisible() { 3124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(true); 3127354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isCursorVisible()); 3128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(false); 3129354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isCursorVisible()); 3130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3133a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPerformLongClick() { 3135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("This is content"); 3137938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3138938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnLongClickListener mockOnLongClickListener = mock(View.OnLongClickListener.class); 3139938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.TRUE); 3140938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3141938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnCreateContextMenuListener mockOnCreateContextMenuListener = 3142938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mock(View.OnCreateContextMenuListener.class); 31434e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov doAnswer((InvocationOnMock invocation) -> { 31444e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov ((ContextMenu) invocation.getArguments() [0]).add("menu item"); 31454e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov return null; 3146938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov }).when(mockOnCreateContextMenuListener).onCreateContextMenu( 314727c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3148938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3149938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnLongClickListener(mockOnLongClickListener); 3150938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener); 3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3152938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3153938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyZeroInteractions(mockOnCreateContextMenuListener); 3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3155938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnLongClickListener); 3156938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.FALSE); 3157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3158938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3159938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 316027c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3162938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnCreateContextMenuListener); 3163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setOnLongClickListener(null); 3164938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu( 316527c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.performLongClick()); 3167938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyNoMoreInteractions(mockOnLongClickListener); 3168938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 316927c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextAttr() { 3175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_textAttr); 3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getText 3177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString()); 3178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getCurrentTextColor 3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHintTextColors().getDefaultColor()); 3186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextScaleX 3190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f); 3191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextScaleX 3193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(2.4f); 3194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f); 3195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(0f); 3197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0f, mTextView.getTextScaleX(), 0.01f); 3198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(- 2.4f); 3200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f); 3201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextSize 3203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 3204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTypeface 3206119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson // getTypeface will be null if android:typeface is set to normal, 3207c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // and android:style is not set or is set to normal, and 3208c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // android:fontFamily is not set 3209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT); 3212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.DEFAULT, mTextView.getTypeface()); 3213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face 3214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null); 3215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // default type face, bold style, note: the type face will be changed 3218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // after call set method 3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); 3220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face, BOLD style 3223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null, Typeface.BOLD); 3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // old type face, null style 3227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, 0); 3228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3232a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAppend() { 3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1: check the original length, should be blank as initialised. 3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getText().length()); 3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 2: append a string use append(CharSquence) into the original blank 3240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was 3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // not already editable. 3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getText() instanceof Editable); 3243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append."); 3244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.", mTextView.getText().toString()); 3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 3: append a string from 0~3. 3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 3); 3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 4: append a string from 0~0, nothing will be append as expected. 3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 0); 3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 5: append a string from -3~3. check the wrong left edge. 3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", -3, 3); 3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 6: append a string from 3~10. check the wrong right edge. 3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 3, 10); 3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 7: append a null string. 3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(null); 3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException"); 3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3279f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3280a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3281f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() { 3282f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3283f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3284f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3285f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3286f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" another text without URL"); 3287f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3288f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3289f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3290f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3291f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL another text without URL", text.toString()); 3292f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3293f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3294f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3295a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3296f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() { 3297f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3298f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3299f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3300f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3301f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3302f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3303f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3304f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3305f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3306f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3307f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3308f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3309a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3310f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenAutoLinkIsEnabled() { 3311f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3312f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3313f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3314f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3315f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3316f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3317f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3318f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3319f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3320f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3321f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3322f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3323f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3324f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3325f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3326a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3327f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() { 3328f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3329f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3330f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with URL http://android.com/before"); 3331f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3332f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3333f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3334f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3335f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3336f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length); 3337f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("First URLSpan URL should be same", 3338f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/before"); 3339f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3340f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[1].getURL(), "http://android.com"); 3341f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text with URL http://android.com/before text with URL http://android.com", 3342f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir text.toString()); 3343f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3344f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3345f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3346a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3347f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() { 3348f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3349f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3350f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3351f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3352f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with a url: http://android.com"); 3353f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3354f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertNotNull("MovementMethod should not be null when text contains url", 3355f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod()); 3356f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url", 3357f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod() instanceof LinkMovementMethod); 3358f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3359f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3360f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3361a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3362f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() { 3363f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3364f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3365f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3366f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3367f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(new SpannableString(" text with a url: http://android.com")); 3368f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3369f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3370f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3371f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3372f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3373f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3374f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3375f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3376f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3377a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3378f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() { 3379f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3380f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3381f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a partial url android."); 3382f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3383f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("com"); 3384f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3385f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3386f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3387f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending to partial URL", 3388f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 1, urlSpans.length); 3389f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3390f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3391f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3392f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3393f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3394a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3395f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() { 3396f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3397f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3398f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a url http://android.com"); 3399f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3400f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("/textview"); 3401f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3402f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3403f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3404f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length); 3405f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the new URL", 3406f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/textview"); 3407f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3408f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 34099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3410a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetLetterSpacing_returnsValueThatWasSet() { 34126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 34136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLetterSpacing(2f); 34146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getLetterSpacing should return the value that was set", 3415a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 2f, mTextView.getLetterSpacing(), 0.0f); 34166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3418a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetLetterSpacingChangesTextWidth() throws Throwable { 34209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 34219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 34229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("aa"); 34239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLetterSpacing(0f); 34249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 34259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 34269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 34276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 34296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 34306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 34316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 34329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 34336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 34346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3436a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with zero letter spacing 34399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float zeroSpacing = mTextView.getLayout().getLineWidth(0); 34406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(1f)); 3442a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with single letter spacing 34459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float singleSpacing = mTextView.getLayout().getLineWidth(0); 34466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(2f)); 3448a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with double letter spacing 34519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float doubleSpacing = mTextView.getLayout().getLineWidth(0); 34526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Double spacing should have two times the spacing of single spacing", 34546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir doubleSpacing - zeroSpacing, 2f * (singleSpacing - zeroSpacing), 1f); 34556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3458a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetFontFeatureSettings_returnsValueThatWasSet() { 34606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 34616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setFontFeatureSettings("\"smcp\" on"); 34626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getFontFeatureSettings should return the value that was set", 34636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir "\"smcp\" on", mTextView.getFontFeatureSettings()); 34646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 346677030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @UiThreadTest 346777030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @Test 3468751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka public void testSetGetFontVariationSettings() { 346977030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView = new TextView(mActivity); 3470a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Context context = InstrumentationRegistry.getTargetContext(); 3471a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Typeface typeface = Typeface.createFromAsset(context.getAssets(), "multiaxis.ttf"); 3472a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setTypeface(typeface); 347377030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3474a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // multiaxis.ttf supports "aaaa", "BBBB", "a b ", " C D" axes. 3475a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3476a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // The default variation settings should be null. 347777030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 347877030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 34790d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] invalidFormatSettings = { 3480a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "invalid syntax", 3481a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaa' 1.0", // tag is not 4 ascii chars 34820d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka }; 34830d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka for (String settings : invalidFormatSettings) { 34840d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka try { 34850d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.setFontVariationSettings(settings); 34860d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka fail(); 3487751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka } catch (IllegalArgumentException e) { 34880d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka // pass. 34890d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 34900d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka assertNull("Must not change settings for " + settings, 34910d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.getFontVariationSettings()); 34920d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 34930d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka 34940d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] nonEffectiveSettings = { 3495a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0", // unsupported tag 3496a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' ' 1.0", // unsupported tag 3497a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'AAAA' 0.7", // unsupported tag (case sensitive) 3498a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' a b' 1.3", // unsupported tag (white space should not be ignored) 3499a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'C D ' 1.3", // unsupported tag (white space should not be ignored) 3500a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0, 'cccc' 2.0", // none of them are supported. 3501a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3502a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3503a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3504a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse("Must return false for " + notEffectiveSetting, 3505a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setFontVariationSettings(notEffectiveSetting)); 3506a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertNull("Must not change settings for " + notEffectiveSetting, 3507a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.getFontVariationSettings()); 3508a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3509a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3510a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka String retainSettings = "'aaaa' 1.0"; 3511a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(retainSettings)); 3512a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3513a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse(mTextView.setFontVariationSettings(notEffectiveSetting)); 3514a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals("Must not change settings for " + notEffectiveSetting, 3515a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka retainSettings, mTextView.getFontVariationSettings()); 3516a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3517a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3518a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // At least one axis is supported, the settings should be applied. 3519a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka final String[] effectiveSettings = { 3520a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0", // supported tag 3521a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'a b ' .7", // supported tag (contains whitespace) 3522a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'BBBB' 0.5", // both are supported 3523a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, ' C D' 0.5", // both are supported 3524a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'bbbb' 0.4", // 'bbbb' is unspported. 3525a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3526a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3527a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String effectiveSetting : effectiveSettings) { 3528a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(effectiveSetting)); 3529a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals(effectiveSetting, mTextView.getFontVariationSettings()); 3530a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 353177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 353277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView.setFontVariationSettings(""); 353377030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 353477030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka } 353577030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3536a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionSingleLineLtr() throws Throwable { 35386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // asserts getOffsetPosition returns correct values for a single line LTR text 35399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final String text = "aaaaa"; 35409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 35419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 35429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 35439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 35449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 35459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 35469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 35476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3549a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 35506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 35519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 35526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 35546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 35556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 35566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 35579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 35586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 35596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35604b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3561023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 35626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int firstOffset = 0; 35646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int lastOffset = text.length() - 1; 35656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int midOffset = text.length() / 2; 35666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view 35686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 35699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float y = mTextView.getHeight() / 2f; 35709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 35716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text 35739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getLayout().getLineWidth(0) - 1f; 35749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset, mTextView.getOffsetForPosition(x, y)); 35756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view 35779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth(); 35789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset + 1, mTextView.getOffsetForPosition(x, y)); 35796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view - out of bounds 35816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = -1f; 35829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 35836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text 35859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = (float) Math.floor(mTextView.getLayout().getLineWidth(0) / 2f + 0.5f); 35869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(midOffset, mTextView.getOffsetForPosition(x, y)); 35876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3589a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineLtr() throws Throwable { 3591023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "aaa\n"; 35926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 35939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 35949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 35959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 35969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 35979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 35989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 35999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3602a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 36086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 36096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 36109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 36116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 36126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3614023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 36156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 36179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 36186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 36206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 36216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float y = lineBounds.height() / 2f; 36229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 36236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 36259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 36299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 36306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2; 36316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 36336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 36349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 36356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 36379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getLayout().getLineWidth(1) - 1f; 36389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 36419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 36459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = (float) Math.floor(mTextView.getLayout().getLineWidth(1) / 2f + 0.5f); 36466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 36479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 36486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 36496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3650a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineRtl() throws Throwable { 3652023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "\u0635\u0635\u0635\n"; 36536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 36549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 36569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 36579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 36589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 36599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 36609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3663a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final LayoutParams layoutParams = new LayoutParams( 36699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.MATCH_PARENT, 36709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.WRAP_CONTENT); 36719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 36726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 36736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3675023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 36766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 36789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 36796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 36819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float x = mTextView.getWidth() - 1f; 36826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float y = lineBounds.height() / 2f; 36839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 36846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 36866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 36879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 36909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 36916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f; 36926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 36949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 36966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 36986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 36999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 37029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - mTextView.getLayout().getLineWidth(1) + 1f; 37039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 37069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - (float) Math.floor( 37079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineWidth(1) / 2f + 0.5f); 37086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 37099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 37106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3713a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsFalseByDefault() { 3715a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 37176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 37186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3721a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsTrueIfSetTextIsSelectableCalledWithTrue() { 3723a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 37256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 37266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 37276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3730a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testSetIsTextSelectable() { 3732a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 37356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusable()); 37366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusableInTouchMode()); 37376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isClickable()); 37386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isLongClickable()); 37396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 37416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 37436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusable()); 37446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusableInTouchMode()); 37456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isClickable()); 37466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isLongClickable()); 37476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(textView.getMovementMethod()); 37486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 3749f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3750a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37514b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessTransformationMethod() throws Throwable { 3752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the password attribute in xml 3753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_password); 3754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the singleLine attribute in xml 3759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_singleLine); 3760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(SingleLineTransformationMethod.getInstance(), 3762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false, 3765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Capitalize.NONE); 3766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final TransformationMethod method = PasswordTransformationMethod.getInstance(); 3767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change transformation method by function 37689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 37696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 37706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTransformationMethod(method); 37716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTransformedText = method.getTransformation(mTextView.getText(), mTextView); 3772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 37736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 3774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3779b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, "H E 2*L O"); 37809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.append(" ")); 3781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3783354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // It will get transformed after a while 3784354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're waiting for transformation to "******" 3785354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(TIMEOUT, () -> mTransformedText.toString() 3786354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .equals("\u2022\u2022\u2022\u2022\u2022\u2022")); 3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set null 37899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTransformationMethod(null)); 3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTransformationMethod()); 3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3795a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testCompound() { 3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int padding = 3; 3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Drawable[] drawables = mTextView.getCompoundDrawables(); 3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[0]); 3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[1]); 3802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[2]); 3803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test setCompoundDrawablePadding and getCompoundDrawablePadding 3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablePadding(padding); 3807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(padding, mTextView.getCompoundDrawablePadding()); 3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using resid, 0 represents null 3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass, 3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su R.drawable.failed, 0); 3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3815a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.start), 3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[0]).getBitmap()); 3817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3818a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.pass), 3819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[1]).getBitmap()); 3820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3821a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.failed), 3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[2]).getBitmap()); 3823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3826a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.blue); 3827a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3828a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using drawables directly 3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null); 3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(), 3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(), 3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(), 3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set bounds to drawables and set them again. 3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 1, 2); 3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 3, 4); 3855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 5, 6); 3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // usinf drawables 3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, top, right, null); 3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(), 3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(), 3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(), 3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 38796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir @UiThreadTest 3880a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 38816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetCompoundDrawablesRelative() { 38826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare textview 38836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 38846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare drawables 3886a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable start = TestUtils.getDrawable(mActivity, R.drawable.blue); 3887a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable end = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3888a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3889a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.black); 38906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(start); 38916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(end); 38926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(top); 38936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(bottom); 38946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir Drawable[] drawables = mTextView.getCompoundDrawablesRelative(); 38966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 38976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 38986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 38996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 39006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 39016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 39026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 39046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 39156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(null, null, null, null); 39266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 39316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 39326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 39336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 39346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 39356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3936a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39374b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSingleLine() throws Throwable { 39389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 39399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 39409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 39419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu setSpannableText(mTextView, "This is a really long sentence" 3942013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu + " which can not be placed in one line on the screen."); 3943013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3944013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu // Narrow layout assures that the text will get wrapped. 39456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout innerLayout = new FrameLayout(mActivity); 3946013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 39479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu innerLayout.addView(mTextView); 3948013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3949013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 3950013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu layout.addView(innerLayout); 3951013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 39529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 39536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(layout); 39549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 3955013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu }); 3956013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mInstrumentation.waitForIdleSync(); 3957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 39599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 3960da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3961da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineWidth = 0; 3962da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineHeight = 0; 3963da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 39649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 39659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineWidth = mTextView.getLayout().getWidth(); 39669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineHeight = mTextView.getLayout().getHeight(); 3967da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 39699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setSingleLine(false)); 3970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 39719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(null, mTextView.getTransformationMethod()); 3972da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 39739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 39749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getHeight() > singleLineHeight); 39759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getWidth() < singleLineWidth); 3976da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // same behaviours as setSingLine(true) 39799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(mTextView::setSingleLine); 3980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 39829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 3983da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 39849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 39859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineHeight, mTextView.getLayout().getHeight()); 39869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineWidth, mTextView.getLayout().getWidth()); 3987da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 3988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3991a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 399298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMaxLines() { 3993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 39946031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) (mTextView.getPaint().measureText(LONG_TEXT) / 4)); 3995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT); 3996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int maxLines = 2; 3998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > maxLines); 3999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxLines(maxLines); 4001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestLayout(); 4002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 400398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2, mTextView.getMaxLines()); 400498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 4005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight()); 4006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4008636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4009a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4010636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_frequencyNone() { 4011636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] BREAK_STRATEGIES = { 4012636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY, 4013636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_BALANCED }; 4014636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4015636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4016636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4017636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int breakStrategy : BREAK_STRATEGIES) { 4018636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4019636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 40206031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 40216031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4022636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4023636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4024636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(breakStrategy); 4025636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4026636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 4027636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4028636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4029636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4030636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4031636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4032636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4033636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4034636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4035636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any break strategy, hyphenation should not happen if 4036636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // HYPHENATION_FREQUENCY_NONE is specified. 4037636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4038636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4039636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4040636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4041636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4042636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4043636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4044636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4045a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4046636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_breakStrategySimple() { 4047636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] HYPHENATION_FREQUENCIES = { 4048636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, 4049636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NONE }; 4050636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4051636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4052636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4053636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) { 4054636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4055636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 40566031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 40576031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4058636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4059636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4060636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 4061636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4062636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(hyphenationFrequency); 4063636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4064636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4065636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4066636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4067636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4068636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4069636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4070636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4071636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any hyphenation frequency, hyphenation should not happen if 4072636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // BREAK_STRATEGY_SIMPLE is specified. 4073636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4074636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4075636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4076636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4077636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4078636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4079636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4081a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxLinesException() { 408372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 408472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 4085fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() >> 3); 408672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setMaxLines(-1); 4087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4089a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 40904b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMinLines() throws Throwable { 4091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4092fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines - 1); 4096fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 409798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines - 1, mTextView.getMinLines()); 409898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4099fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines + 1); 4101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 410298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines + 1, mTextView.getMinLines()); 410398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4106a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41074b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLines() throws Throwable { 4108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multiple lines 4110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4113fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines - 1); 4114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines + 1); 4117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4121a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLinesException() { 412372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 412472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 412572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setWidth(mTextView.getWidth() >> 3); 412672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setLines(-1); 4127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4130a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingTop() { 4132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingTop()); 4135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4137a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 4139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 4140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop()); 4141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 4145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingTop() > 0); 4147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4150a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingBottom() { 4152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingBottom()); 4155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4157a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 4159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 4160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom()); 4161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 4165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingBottom() > 0); 4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4169a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingTop() throws Throwable { 4171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingTop()); 4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4176a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 41789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 41796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, top, null, null); 41806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 41816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 4182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop()); 4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getHeight() 4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineTop(mTextView.getLineCount()); 4191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingTop()); 4192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4194a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41954b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingBottom() throws Throwable { 4196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingBottom()); 4199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4201a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 42039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 42046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, null, null, bottom); 42056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 42066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER_VERTICAL); 4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom()); 4210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = ((mTextView.getHeight() 4214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingTop() 4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1) 4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + mTextView.getExtendedPaddingBottom(); 4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingBottom()); 4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4222a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingLeft() { 4224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingLeft()); 4227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4229a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.red); 4230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 10, 100); 4231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, null, null, null); 4232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 4233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4241a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingRight() { 4243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingRight()); 4246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4248a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.red); 4249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 10, 100); 4250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, right, null); 4251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_HORIZONTAL); 4252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 42599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4260a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetUrls() { 4262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = mTextView.getUrls(); 4265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, spans.length); 4266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String url = "http://www.google.com"; 4268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String email = "name@gmail.com"; 4269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = url + " mailto:" + email; 4270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString spannable = new SpannableString(string); 4271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(url), 0, url.length(), 0); 4272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 4275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(email), 0, email.length(), 0); 4278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(email, spans[1].getURL()); 4284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test the situation that param what is not a URLSpan 4286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new Object(), 0, 9, 0); 4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 42929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4293a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetPadding() { 4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(0, 1, 2, 4); 4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getPaddingLeft()); 4299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getPaddingTop()); 4300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getPaddingRight()); 4301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getPaddingBottom()); 4302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(10, 20, 30, 40); 4304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(10, mTextView.getPaddingLeft()); 4305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20, mTextView.getPaddingTop()); 4306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(30, mTextView.getPaddingRight()); 4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(40, mTextView.getPaddingBottom()); 4308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4311a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4312fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testDeprecatedSetTextAppearance() { 4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All); 4316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 4319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 4321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors); 4326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors); 4334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(17f, mTextView.getTextSize(), 0.01f); 4335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style); 4338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(null, mTextView.getTypeface()); 4339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4342a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4343fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testSetTextAppearance() { 4344fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4345fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4346fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_All); 4347fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4348fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4349fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(20f, mTextView.getTextSize(), 0.01f); 4350fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4351fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.red), 4352fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4353fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4354fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 43556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 43566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4357fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4358fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Colors); 4359fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4360fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4361fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4362fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4363fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4364fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 43656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.red), 43666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4367fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4368fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_NotColors); 4369fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(17f, mTextView.getTextSize(), 0.01f); 4370fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4371fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4372fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Style); 4373fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(null, mTextView.getTypeface()); 4374fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4375fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 43769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4377a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4378fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testAccessCompoundDrawableTint() { 4379fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4380fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4381fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai ColorStateList colors = ColorStateList.valueOf(Color.RED); 4382fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintList(colors); 4383fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR); 4384fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertSame(colors, mTextView.getCompoundDrawableTintList()); 4385fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4386f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4387f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette // Ensure the tint is preserved across drawable changes. 4388f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawablesRelative(null, null, null, null); 4389f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4390f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4391f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4392f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(null, null, null, null); 4393f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4394f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4395f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4396f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr1 = new ColorDrawable(Color.RED); 4397f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr2 = new ColorDrawable(Color.GREEN); 4398f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr3 = new ColorDrawable(Color.BLUE); 4399f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr4 = new ColorDrawable(Color.YELLOW); 4400f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4); 4401f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4402f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4403fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4404fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4405a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44064b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetHorizontallyScrolling() throws Throwable { 4407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the text view has more than one line 4408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 1); 4410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(true); 4413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 4414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(false); 4416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4419a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeHorizontalScrollRange() throws Throwable { 44219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 44229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 44249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 44259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 44269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 44299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 44319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set the layout 44349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 44359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getWidth(), 44369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4439a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeVerticalScrollRange() throws Throwable { 44419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 44429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 4444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 44459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 44469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollRange()); 4447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 44499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getHeight(), ((MockTextView) mTextView).computeVerticalScrollRange()); 4451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the layout 44539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 44549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getHeight(), 44559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeVerticalScrollRange()); 4456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4458a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDrawableStateChanged() throws Throwable { 44609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 44619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 44639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.refreshDrawableState(); 44649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).drawableStateChanged(); 4465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4468a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultEditable() { 44709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 4471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultEditable() does nothing, and always return false. 44739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView) mTextView).getDefaultEditable()); 4474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4477a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultMovementMethod() { 4479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultMovementMethod() does nothing, and always return null. 4482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getDefaultMovementMethod()); 4483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4486a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetFrame() { 4488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a new size to this view 4491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(0, 0, 320, 480)); 4492b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getLeft()); 4493b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getTop()); 4494b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(320, textView.getRight()); 4495b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(480, textView.getBottom()); 4496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a same size to this view 4498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.setFrame(0, 0, 320, 480)); 4499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //negative input 4501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(-1, -1, -1, -1)); 4502b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getLeft()); 4503b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getTop()); 4504b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getRight()); 4505b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getBottom()); 4506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4508a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 45094b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testMarquee() throws Throwable { 4510354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Both are pointing to the same object. This works around current limitation in CTS 4511354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // coverage report tool for properly reporting coverage of base class method calls. 45129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 45139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mSecondTextView = new MockTextView(mActivity); 4514354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 45159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = mSecondTextView; 45169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(LONG_TEXT); 45179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 45189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setEllipsize(TruncateAt.MARQUEE); 45199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLayoutParams(new LayoutParams(100, 100)); 45209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 45219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4522bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4523bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 45249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView); 4525bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the fading to be shown 45279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setHorizontalFadingEdgeEnabled(true); 4528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 4530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu TestSelectedRunnable runnable = new TestSelectedRunnable(mTextView) { 4533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 45349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(-1); 4535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to start 4536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 45379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(true); 4538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 4539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 45419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // wait for the marquee to run 4544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // fading is shown on both sides if the marquee runs for a while 45459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 45469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f 45479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu && ((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45490f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir // wait for left marquee to fully apply 45509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 45519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.99f); 4552354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 4553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected1()); 4554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected2()); 45559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(-1, mTextView.getMarqueeRepeatLimit()); 4556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu runnable = new TestSelectedRunnable(mTextView) { 4558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 45599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(0); 4560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 4561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 45629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(false); 4563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 45649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setGravity(Gravity.LEFT); 4565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 4567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 45689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected1()); 4571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected2()); 45729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 45739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 45749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getMarqueeRepeatLimit()); 4575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.RIGHT)); 4577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 45789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f); 45799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getRightFadingEdgeStrength(), 0.01f); 4580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.CENTER_HORIZONTAL)); 4582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no left fading (Is it correct?) 45849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 45859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4589a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 45906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetMarqueeRepeatLimit() { 45916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final TextView textView = new TextView(mActivity); 45926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 45936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setMarqueeRepeatLimit(10); 45946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(10, textView.getMarqueeRepeatLimit()); 45956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 45966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 45979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4598a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessInputExtras() throws XmlPullParserException, IOException { 46009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 46019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 46029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT); 4603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // do not create the extras 46059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getInputExtras(false)); 4606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // create if it does not exist 46089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Bundle inputExtras = mTextView.getInputExtras(true); 4609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(inputExtras); 4610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(inputExtras.isEmpty()); 4611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it is created already 46139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNotNull(mTextView.getInputExtras(false)); 4614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 46169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputExtras(R.xml.input_extras); 4617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 4618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 4619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4623a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessContentType() { 46259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 46269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 46279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 46289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 46349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateTimeKeyListener); 4635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 46409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateKeyListener); 4641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 46469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TimeKeyListener); 4647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_NUMBER 4649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4650fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 46539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 465473eaebf6dc49e5db83438be84bce12579fe94c94Roozbeh Pournader assertSame(mTextView.getKeyListener(), 46554e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader DigitsKeyListener.getInstance(null, true, true)); 4656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_PHONE); 46589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 46599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DialerKeyListener); 4660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 46659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE)); 4666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 46689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 46699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 46749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 46759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.CHARACTERS)); 46779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 4678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4680fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 46839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.WORDS)); 46859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 46919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4692fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.SENTENCES)); 4693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_NULL); 46959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_NULL, mTextView.getInputType()); 46969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TextKeyListener); 4697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4700a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessRawContentType() { 47029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 47039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 47049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 47059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 47119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 47189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 47259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_NUMBER 4729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 47339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 47349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_PHONE); 47389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 47399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 47469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 47509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 47569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 47579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 47649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 47719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_NULL); 47759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4780a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 478172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testVerifyDrawable() { 47829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 478372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4784a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 47859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView ) mTextView).verifyDrawable(d)); 478672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 47879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, null); 47889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView ) mTextView).verifyDrawable(d)); 478972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 479072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4791a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 479272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessPrivateImeOptions() { 479372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 479472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 479572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 479672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3"); 479772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions()); 479872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 479972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions(null); 480072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 480172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 480272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4803a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 480472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetOnEditorActionListener() { 480572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 480672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 480798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView.OnEditorActionListener mockOnEditorActionListener = 480898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mock(TextView.OnEditorActionListener.class); 480998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 481072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 481198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setOnEditorActionListener(mockOnEditorActionListener); 481298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 481372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 481472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE); 481598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockOnEditorActionListener, times(1)).onEditorAction(mTextView, 481698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov EditorInfo.IME_ACTION_DONE, null); 481772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 481872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4819a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 482072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeOptions() { 482172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 482272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 482372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 482472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_GO); 482572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions()); 482672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 482772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE); 482872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions()); 482972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 483072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_NULL); 483172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 483272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 483372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4834a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 483572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeActionLabel() { 483672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 483772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getImeActionLabel()); 483872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getImeActionId()); 483972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 484072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeActionLabel("pinyin", 1); 484172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("pinyin", mTextView.getImeActionLabel().toString()); 484272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(1, mTextView.getImeActionId()); 484372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 484472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4846a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4847d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa public void testAccessImeHintLocales() { 4848d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final TextView textView = new TextView(mActivity); 4849d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setText("", BufferType.EDITABLE); 4850d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setKeyListener(null); 4851d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setRawInputType(InputType.TYPE_CLASS_TEXT); 4852d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(textView.getImeHintLocales()); 4853d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4854d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4855d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4856d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(editorInfo.hintLocales); 4857d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4858d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4859d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US"); 4860d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setImeHintLocales(localeList); 4861d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, textView.getImeHintLocales()); 4862d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4863d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4864d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4865d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, editorInfo.hintLocales); 4866d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4867d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4868d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4869c873101a88e7ba584065de5e912508237378ca99Victoria Lease @UiThreadTest 4870a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 48714e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesChangesInputType() { 48724e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 48734e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 48744e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 48754e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(InputType.TYPE_CLASS_NUMBER); 48764e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(InputType.TYPE_CLASS_NUMBER, textView.getInputType()); 48774e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 48784e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final LocaleList localeList = LocaleList.forLanguageTags("fa-IR"); 48794e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(localeList); 48804e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL; 48814e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting IME hint locales to Persian must change the input type to a full text IME, 48824e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // since the typical number input IME may not have localized digits. 48834e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 48844e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 48854e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to datetime should keep the full text IME, since the IME hint 48864e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // is still set to Persian, which needs advanced input. 48874e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int dateType = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE; 48884e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(dateType); 48894e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 48904e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 48914e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to number password should keep the full text IME, since the IME 48924e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // hint is still set to Persian, which needs advanced input. But it also needs to set the 48934e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // text password flag. 48944e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int numberPasswordType = InputType.TYPE_CLASS_NUMBER 48954e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_NUMBER_VARIATION_PASSWORD; 48964e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textPasswordType = InputType.TYPE_CLASS_TEXT 48974e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_PASSWORD; 48984e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(numberPasswordType); 48994e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textPasswordType, textView.getInputType()); 49004e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49014e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting the IME hint locales to null should reset the type to number password, since we 49024e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // no longer need internationalized input. 49034e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(null); 49044e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(numberPasswordType, textView.getInputType()); 49054e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 49064e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49074e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 49084e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 49094e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesDoesntLoseInputType() { 49104e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 49114e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 49124e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int inputType = InputType.TYPE_CLASS_TEXT 49134e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT 49144e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS 49154e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_MULTI_LINE 49164e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 49174e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(inputType); 49184e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(new LocaleList(Locale.US)); 49194e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(inputType, textView.getInputType()); 49204e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 49214e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49224e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 49234e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 492472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetExtractedText() { 492572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 492672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 492772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.getText().toString()); 492872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 492972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText et = new ExtractedText(); 4930ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4931ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text and selection. 493272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach et.text = "test"; 4933ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 0; 4934ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 2; 493572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 493672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setExtractedText(et); 493772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("test", mTextView.getText().toString()); 4938ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(0, mTextView.getSelectionStart()); 4939ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionEnd()); 4940ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4941ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Use partialStartOffset and partialEndOffset 4942ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 2; 4943ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4944ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = "x"; 4945ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 2; 4946ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 3; 4947ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4948ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4949ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4950ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionStart()); 4951ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, mTextView.getSelectionEnd()); 4952ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4953ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text with spans. 4954ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final SpannableString ss = new SpannableString("ex"); 4955ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new UnderlineSpan(), 0, 2, 0); 4956ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0); 4957ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4958ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = ss; 4959ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 1; 4960ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4961ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4962ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4963ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4964ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final Editable editable = mTextView.getEditableText(); 4965ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans( 4966ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), UnderlineSpan.class); 4967ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, underlineSpans.length); 4968ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, editable.getSpanStart(underlineSpans[0])); 4969ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(underlineSpans[0])); 4970ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4971ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final URLSpan[] urlSpans = mTextView.getEditableText().getSpans( 4972ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), URLSpan.class); 4973ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, urlSpans.length); 4974ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, editable.getSpanStart(urlSpans[0])); 4975ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(urlSpans[0])); 4976ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("ctstest://TextView/test", urlSpans[0].getURL()); 497772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 497872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4979a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 498072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testMoveCursorToVisibleOffset() throws Throwable { 498172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 498272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 498372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // not a spannable text 49844b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 498572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 498672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 498772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a selection range 498872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach final String spannableText = "text"; 49896b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 49909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 499172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 49924b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 4993a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov () -> mTextView.setText(spannableText, BufferType.SPANNABLE)); 499472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 499572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length()); 499672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 499772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getSelectionStart()); 499872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(spannableText.length(), mTextView.getSelectionEnd()); 49994b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 500072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 500172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 500272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a spannable without range 50034b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 50046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 50056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(spannableText, BufferType.SPANNABLE); 500672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 500772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 500872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50094b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertTrue(mTextView.moveCursorToVisibleOffset())); 501072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 501172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 501272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5013a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5014afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void testIsInputMethodTarget() throws Throwable { 501572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 501672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isInputMethodTarget()); 501772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 501872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isFocused()); 50194b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 50206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 50216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 50226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu }); 5023afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mInstrumentation.waitForIdleSync(); 5024afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu assertTrue(mTextView.isFocused()); 502504d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu 5026b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mTextView::isInputMethodTarget); 502772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 502872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5030a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 50316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testBeginEndBatchEditAreNotCalledForNonEditableText() { 5032b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir final TextView mockTextView = spy(new TextView(mActivity)); 5033b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 5034b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // TextView should not call onBeginBatchEdit or onEndBatchEdit during initialization 5035b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5036b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 503872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.beginBatchEdit(); 5040b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5041b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5042b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.endBatchEdit(); 5045b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5046b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5047b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 50496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5050a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 50514b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testBeginEndBatchEditCallbacksAreCalledForEditableText() throws Throwable { 50529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new TextView(mActivity))); 50539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 50546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5055a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final FrameLayout layout = new FrameLayout(mActivity); 50566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 50576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 50586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 50599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 50606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 50616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 50636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 50646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 50669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 50679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 50689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.requestFocus(); 50696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir }); 50706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 50716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 50739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.hasFocus()); 50749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 50759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 50766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.beginBatchEdit(); 50786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onBeginBatchEdit(); 50809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 5081b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 50829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 50839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.endBatchEdit(); 50849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 50859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onEndBatchEdit(); 508672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 508772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 508872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5089a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 509072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBringPointIntoView() throws Throwable { 509172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 509272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(1)); 509372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 509472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.layout(0, 0, 100, 100); 509572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(2)); 509672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 509772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5098a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 509972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testCancelLongPress() { 510072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 51019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 510272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.cancelLongPress(); 510372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 510472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 510572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5106a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 510772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testClearComposingText() { 510872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 510972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText("Hello world!", BufferType.SPANNABLE); 511072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Spannable text = (Spannable) mTextView.getText(); 511172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 511372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 511472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach BaseInputConnection.setComposingSpans((Spannable) mTextView.getText()); 511672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 511772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 511872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.clearComposingText(); 512072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 512172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 512272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 512372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 51249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5125a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 512672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testComputeVerticalScrollExtent() { 51279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 51289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 512972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5130a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 51319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, d); 513272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 51339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 513472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 513572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 513672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5137a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 513872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testDidTouchFocusSelect() { 5139c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne mTextView = new EditText(mActivity); 514072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.didTouchFocusSelect()); 514172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 514272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setFocusable(true); 514372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.requestFocus(); 514472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.didTouchFocusSelect()); 514572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 514672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5147a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 51484b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSelectAllJustAfterTap() throws Throwable { 51490ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Prepare an EditText with focus. 51509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 51516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 51526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 51530ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(mTextView.didTouchFocusSelect()); 51556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 51566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 51576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.didTouchFocusSelect()); 51580ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello, World.", BufferType.SPANNABLE); 51600ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 51610ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 51620ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51630ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Tap the view to show InsertPointController. 51649404cdc3d439d5a2d1b805934c53a8ba6dc68fa8Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 516583a70cb57c839148a4feff786cdbb3803828d484Bobby Wang // bad workaround for waiting onStartInputView of LeanbackIme.apk done 516683a70cb57c839148a4feff786cdbb3803828d484Bobby Wang try { 516783a70cb57c839148a4feff786cdbb3803828d484Bobby Wang Thread.sleep(1000); 516883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } catch (InterruptedException e) { 516983a70cb57c839148a4feff786cdbb3803828d484Bobby Wang e.printStackTrace(); 517083a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } 51710ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51720ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Execute SelectAll context menu. 51739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.onTextContextMenuItem(android.R.id.selectAll)); 51740ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 51750ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51760ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // The selection must be whole of the text contents. 51770ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(0, mTextView.getSelectionStart()); 517883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang assertEquals("Hello, World.", mTextView.getText().toString()); 51790ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(mTextView.length(), mTextView.getSelectionEnd()); 51800ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 51810ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5183a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 518472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testExtractText() { 518572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 518672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 518772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedTextRequest request = new ExtractedTextRequest(); 518872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText outText = new ExtractedText(); 518972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 519072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.token = 0; 519172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.flags = 10; 519272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxLines = 2; 519372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxChars = 20; 519472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 519572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 519672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 519772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 519872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 519972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 520072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach outText.text.toString()); 5201c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi 5202c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi // Tests for invalid arguments. 5203c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(request, null)); 5204c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, outText)); 5205c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, null)); 520672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 520772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 520894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5209a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 521094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testTextDirectionDefault() { 5211c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 52122a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 521394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 521494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 521594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5216a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 521794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testSetGetTextDirection() { 5218c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 521994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52212a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection()); 522294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection()); 522594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 522894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 522994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 52302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection()); 523194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 523294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 52332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection()); 523494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 523594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 52362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection()); 523702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 523802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 523902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection()); 524002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 524102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 524202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection()); 524394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 524494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 524594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5246a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 524794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtr() { 5248c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 524994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 525094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 52512a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 525294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 525394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52542a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 525594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 525694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 525894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 525994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 526194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 52632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 526494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 52662a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 526794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 52692a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 527002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 527102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 527202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 527302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 527402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 527502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 527694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 527794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 527894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5279a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 528094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtrWithInheritance() { 5281c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 528294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 528394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5284c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 528594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 528694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 528794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 528894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 529094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 529394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52952a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 529694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 52982a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 529994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 530094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53012a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 530294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 530394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53042a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 530502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 530602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 530702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 530802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 530902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 531002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 531194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 531294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 531394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5314a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 531594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtl() { 5316c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 531794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 531894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 53192a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 532094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 532194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53222a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 532394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 532494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 53252a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 532694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 532794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53282a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 532994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53312a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 533294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53342a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 533594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53372a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 533802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 533902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 534002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 534102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 534302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 534494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 534594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 534694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5347a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 534894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtlWithInheritance() { 5349c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 535094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 535194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5352c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 535394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 535494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 535594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 535694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53572a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 535894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 535994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 53602a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 536194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53632a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 536494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53662a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 536794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53692a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 537094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 537194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53722a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 537394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 537402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 537502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 537602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 537702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 537802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 537902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 538094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio // Force to RTL text direction on the layout 538194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 538294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 538394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53842a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 538594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 538694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 53872a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 538894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 538994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53902a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 539194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 539294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53932a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 539494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 539594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53962a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 539794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 539894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53992a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 540002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 540102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 540202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 540302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 540402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 540502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 540694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 540794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 540894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5409a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 541094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testResetTextDirection() { 5411c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5412c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 541394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 541494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 541594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 54162a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 541794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5418f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // No reset when we remove the view 541994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.removeView(tv); 5420f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 5421f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio 5422f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // Reset is done when we add the view 5423f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio ll.addView(tv); 54242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 542594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 542694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 542702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5428a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 542902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongLtr() { 543002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 543102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 543202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 543302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 543402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 543502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 543602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 543702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 543802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 543902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 544002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 544102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 544202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 544302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 544402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 544502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 544602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 544702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 544802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 544902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 545002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 545102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 545202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 545302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 545402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 545502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 545602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 545702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 545802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 545902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 546002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 546102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 546202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is LTR. 546302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 546402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 546502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 546602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 546702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 546802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 546902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 547002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 547102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 547202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 547302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 547402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 547502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 547602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 547702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 547802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5479a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 548002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongRtl() { 548102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 548202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 548302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 548402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 548502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 548602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 548702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 548802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 548902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 549002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 549102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 549202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 549302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 549402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 549502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 549602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 549702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 549802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 549902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 550002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 550102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 550202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 550302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 550402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 550502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 550602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 550702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 550802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 550902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 551002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 551102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 551202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 551302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is RTL. 551402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 551502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 551602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 551702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 551802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 551902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 552002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 552102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 552202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 552302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 552402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 552502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 552602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 552702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 552802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 55299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5530a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5531c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader public void testTextLocales() { 5532c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader TextView tv = new TextView(mActivity); 5533c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.getDefault(), tv.getTextLocale()); 5534c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.getDefault(), tv.getTextLocales()); 5535c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5536c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(Locale.CHINESE); 5537c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.CHINESE, tv.getTextLocale()); 5538c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales()); 5539c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5540c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(LocaleList.forLanguageTags("en,ja")); 5541c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale()); 5542c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales()); 5543c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5544c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5545c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(null); 5546c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to null should throw"); 5547c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5548c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5549c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5550c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5551c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5552c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(null); 5553c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locales to null should throw"); 5554c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5555c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5556c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5557c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5558c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5559c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(new LocaleList()); 5560c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to an empty list should throw"); 5561c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5562c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5563c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5564c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5565c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 55669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5567a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5568a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_Localization() { 5569a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String testString = "abcdefghijklmnopqrstuvwxyz i\u0307\u0301 άέήίΐόύΰώάυ ή"; 5570a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5571a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // Capital "i" in Turkish and Azerbaijani is different from English, Lithuanian has special 5572a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // rules for uppercasing dotted i with accents, and Greek has complex capitalization rules. 5573a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale[] testLocales = { 5574a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("az", "AZ"), // Azerbaijani 5575a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("tr", "TR"), // Turkish 5576a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("lt", "LT"), // Lithuanian 5577a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("el", "GR"), // Greek 5578a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader Locale.US, 5579b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka }; 5580b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5581a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5582b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setAllCaps(true); 5583b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka for (Locale locale: testLocales) { 5584b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setTextLocale(locale); 5585b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka assertEquals("Locale: " + locale.getDisplayName(), 5586a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader UCharacter.toUpperCase(locale, testString), 5587b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.getTransformationMethod().getTransformation(testString, tv).toString()); 5588b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5589b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5590b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5591dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5592a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5593a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_SpansArePreserved() { 5594a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale greek = new Locale("el", "GR"); 5595a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String lowerString = "ι\u0301ριδα"; // ίριδα with first letter decomposed 5596a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String upperString = "ΙΡΙΔΑ"; // uppercased 5597a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // expected lowercase to uppercase index map 5598a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int[] indexMap = {0, 1, 1, 2, 3, 4, 5}; 5599a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int flags = Spanned.SPAN_INCLUSIVE_INCLUSIVE; 5600a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5601a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5602a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setTextLocale(greek); 5603a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setAllCaps(true); 5604a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5605a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spannable source = new SpannableString(lowerString); 5606a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 1, flags); 5607a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 2, flags); 5608a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 3, flags); 5609a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 3, 4, flags); 5610a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 4, 5, flags); 5611a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 5, 6, flags); 5612a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 2, flags); 5613a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 3, flags); 5614a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 4, flags); 5615a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 6, flags); 5616a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] sourceSpans = source.getSpans(0, source.length(), Object.class); 5617a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5618a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final CharSequence transformed = 5619a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.getTransformationMethod().getTransformation(source, tv); 5620a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertTrue(transformed instanceof Spanned); 5621a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spanned result = (Spanned) transformed; 5622a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5623a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(upperString, transformed.toString()); 5624a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] resultSpans = result.getSpans(0, result.length(), Object.class); 5625a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(sourceSpans.length, resultSpans.length); 5626a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader for (int i = 0; i < sourceSpans.length; i++) { 5627a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertSame(sourceSpans[i], resultSpans[i]); 5628a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object span = sourceSpans[i]; 5629a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanStart(span)], result.getSpanStart(span)); 5630a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanEnd(span)], result.getSpanEnd(span)); 5631a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(source.getSpanFlags(span), result.getSpanFlags(span)); 5632a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5633a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5634a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5635a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @UiThreadTest 5636a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @Test 5637dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testTextAlignmentDefault() { 5638a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 56397fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5640dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // resolved default text alignment is GRAVITY 56417fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5642dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5643dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5644dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5645a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5646dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testSetGetTextAlignment() { 5647a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5648dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5649dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 56507fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5651dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5652dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 56537fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment()); 5654dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5655dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 56567fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment()); 5657dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5658dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 56597fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment()); 5660dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5661dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 56627fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment()); 5663dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5664dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 56657fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment()); 5666dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5667dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5668dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5669a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5670dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignment() { 5671a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5672dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 56737fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5674dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5675757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test center alignment first so that we dont hit the default case 5676dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 56777fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5678dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5679757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test the default case too 5680757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5681757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5682757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio 5683dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 56847fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5685dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5686dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 56877fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5688dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5689dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 56907fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5691dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5692dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 56937fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5694dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5695dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5696dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5697a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5698dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignmentWithInheritance() { 5699a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = new LinearLayout(mActivity); 5700dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5701dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5702a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5703dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.addView(tv); 5704dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5705dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // check defaults 57067fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5707dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5708dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5709dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // set inherit and check that child is following parent 5710dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 57117fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment()); 5712dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5713dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 57147fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5715dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5716dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 57177fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5718dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5719dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 57207fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5721dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5722dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57237fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5724dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5725dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57267fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5727dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5728dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // now get rid of the inheritance but still change the parent 5729dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5730dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5731dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 57327fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5733dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5734dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 57357fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5736dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5737dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 57387fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5739dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5740dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57417fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5742dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5743dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57447fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5745dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5746dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5747dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5748a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5749dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testResetTextAlignment() { 5750a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5751a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 5752dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5753dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5754dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 57557fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5756dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 57574f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // No reset when we remove the view 5758dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.removeView(tv); 57594f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 57604f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio 57614f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Reset is done when we add the view 57624f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Default text alignment is GRAVITY 57634f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio ll.addView(tv); 57647fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5765dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5766dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5767938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @UiThreadTest 5768a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5769938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testDrawableResolution() { 5770b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5771938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5772a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5773938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5774a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5775938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5776b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5777b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.2: left / right drawable defined in default RTL mode 5778938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5779a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5780938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5781a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5782938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5783b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5784b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.1: start / end drawable defined in LTR mode 5785938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_1); 5786a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5787938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5788a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5789938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5790b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5791b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.2: start / end drawable defined in RTL mode 5792938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_2); 5793a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5794938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5795a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5796938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5797b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5798b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.1: left / right / start / end drawable defined in LTR mode 5799938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_1); 5800a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5801938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5802a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5803938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5804b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5805b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.2: left / right / start / end drawable defined in RTL mode 5806938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_2); 5807a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5808938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5809a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5810938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5811b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5812b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.1: start / end drawable defined in LTR mode inside a layout 5813b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5814938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_1); 5815a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5816938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5817a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5818938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5819b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5820b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.2: start / end drawable defined in RTL mode inside a layout 5821b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5822938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_2); 5823a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5824938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5825a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5826938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5827b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5828b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout 5829b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5830938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_1); 5831a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5832938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5833a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5834938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5835b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5836b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout 5837b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5838938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_2); 5839a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5840938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5841a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5842938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5843b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio } 5844b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 58459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio @UiThreadTest 5846a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 58479776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio public void testDrawableResolution2() { 58489776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5849938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5850a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5851938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 58529776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5853a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(null, null, 5854a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null); 5855a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, R.drawable.icon_yellow, -1, -1); 58569776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5857938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5858a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5859938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 58609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5861a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null, 5862a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null); 5863a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 58649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5865938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_ltr); 5866a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, -1, -1, -1); 58679776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5868a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_blue), null, 5869a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_red), null); 5870a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, -1, -1); 58719776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5872a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawablesRelative(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), 5873a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null, null); 5874a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 5875938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 5876938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5877a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5878938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testCompoundAndTotalPadding() { 5879938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Resources res = mActivity.getResources(); 5880938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int drawablePadding = res.getDimensionPixelSize(R.dimen.textview_drawable_padding); 5881938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingLeft = res.getDimensionPixelSize(R.dimen.textview_padding_left); 5882938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingRight = res.getDimensionPixelSize(R.dimen.textview_padding_right); 5883938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingTop = res.getDimensionPixelSize(R.dimen.textview_padding_top); 5884938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingBottom = res.getDimensionPixelSize(R.dimen.textview_padding_bottom); 5885938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int iconSize = TestUtils.dpToPx(mActivity, 32); 5886938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5887938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewLtr = (TextView) mActivity.findViewById( 5888938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_ltr); 5889938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftLtr = paddingLeft + drawablePadding + iconSize; 5890938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightLtr = paddingRight + drawablePadding + iconSize; 5891938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingLeft()); 5892938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingStart()); 5893938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingLeft()); 5894938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingStart()); 5895938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingRight()); 5896938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingEnd()); 5897938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingRight()); 5898938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingEnd()); 5899938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5900938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingTop()); 5901938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5902938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingBottom()); 5903938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5904938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewRtl = (TextView) mActivity.findViewById( 5905938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_rtl); 5906938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftRtl = paddingLeft + drawablePadding + iconSize; 5907938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightRtl = paddingRight + drawablePadding + iconSize; 5908938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingLeft()); 5909938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingEnd()); 5910938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingLeft()); 5911938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingEnd()); 5912938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingRight()); 5913938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingStart()); 5914938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingRight()); 5915938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingStart()); 5916938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5917938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingTop()); 5918938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5919938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingBottom()); 59209776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 59219776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 59229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5923a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5924e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetBreakStrategy() { 5925e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5926e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5927a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final PackageManager pm = mInstrumentation.getTargetContext().getPackageManager(); 59282751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka 5929d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for 59302751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // TextView except for Android Wear. The default value for Android Wear is 59312751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // BREAK_STRATEGY_BALANCED. 59322751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { 59332751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // Android Wear 59342751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 59352751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } else { 59362751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // All other form factor. 59372751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 59382751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } 5939e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5940e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5941e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy()); 5942e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5943e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5944e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 5945e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5946e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5947e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 5948d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5949d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi EditText et = new EditText(mActivity); 5950d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5951d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for 5952d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // EditText. 5953d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5954d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5955d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5956d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5957d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5958d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5959d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy()); 5960d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5961d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5962d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy()); 5963e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5964e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 59659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5966a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5967e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetHyphenationFrequency() { 5968e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5969e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5970d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5971e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5972e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 5973e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency()); 5974e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5975e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); 5976e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 5977e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5978e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); 5979e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency()); 5980e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 5981e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5982a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @UiThreadTest 5983a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @Test 5984a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka public void testSetGetJustify() { 5985a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka TextView tv = new TextView(mActivity); 5986a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 5987598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 5988598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_INTER_WORD); 5989598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, tv.getJustificationMode()); 5990598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_NONE); 5991598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 5992a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka } 5993a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 5994a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 59954796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka public void testJustificationByStyle() { 59964796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView defaultTv = findTextView(R.id.textview_justification_default); 59974796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView noneTv = findTextView(R.id.textview_justification_none); 59984796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView interWordTv = findTextView(R.id.textview_justification_inter_word); 59994796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 60004796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, defaultTv.getJustificationMode()); 60014796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, noneTv.getJustificationMode()); 60024796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, interWordTv.getJustificationMode()); 60034796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka } 60044796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 60054796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka @Test 60064b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetAndGetCustomSelectionActionModeCallback() throws Throwable { 600732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final String text = "abcde"; 60089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 60106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 60116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 60126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTextIsSelectable(true); 60136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 60146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 601532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 601632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 601732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 601832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 601932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomSelectionActionModeCallback()); 602032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 602198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 602298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 602398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 602498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomSelectionActionModeCallback(mockActionModeCallback); 602598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, 602632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.getCustomSelectionActionModeCallback()); 602732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 60306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 60316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 60326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 60336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 60346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 603532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 603632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 603732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 603898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 603998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 604032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 60436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 604432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 604532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 604632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 604732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was blocked. 604898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, never()).onDestroyActionMode(any(ActionMode.class)); 604932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 605098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov // Reset and reconfigure callback. 605198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockActionModeCallback); 605298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 605398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.TRUE); 605498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomSelectionActionModeCallback()); 605532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 60586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 60596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 60606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 60616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 60626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 606332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 606432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 606532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 606632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 606798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 606898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 606932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 60726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 607332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 607432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 607532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 607632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was started 607798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onDestroyActionMode(any(ActionMode.class)); 607832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 607932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 6081a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 608298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testSetAndGetCustomInsertionActionMode() { 608332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi initTextViewForTyping(); 608432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 608532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomInsertionActionModeCallback()); 608632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 608798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 608898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 608998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 609098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomInsertionActionModeCallback(mockActionModeCallback); 609198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomInsertionActionModeCallback()); 609232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // TODO(Bug: 22033189): Tests the set callback is actually used. 609332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 609432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 609589b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @UiThreadTest 609689b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @Test 609789b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky public void testRespectsViewFocusability() { 609889b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky TextView v = (TextView) mActivity.findViewById(R.id.textview_singleLine); 609989b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertFalse(v.isFocusable()); 610089b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky // TextView used to set focusable to true or false verbatim which would break the following. 610189b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky v.setClickable(true); 610289b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertTrue(v.isFocusable()); 610389b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky } 610489b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky 6105a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testTextShadows() throws Throwable { 610798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textViewWithConfiguredShadow = 610898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov (TextView) mActivity.findViewById(R.id.textview_with_shadow); 6109a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, textViewWithConfiguredShadow.getShadowDx(), 0.0f); 6110a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, textViewWithConfiguredShadow.getShadowDy(), 0.0f); 6111a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textViewWithConfiguredShadow.getShadowRadius(), 0.0f); 611298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.GREEN, textViewWithConfiguredShadow.getShadowColor()); 611332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 611498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6115a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDx(), 0.0f); 6116a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDy(), 0.0f); 6117a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowRadius(), 0.0f); 611832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 61199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setShadowLayer(5.0f, 3.0f, 4.0f, Color.RED)); 612098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6121a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textView.getShadowDx(), 0.0f); 6122a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(4.0f, textView.getShadowDy(), 0.0f); 6123a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(5.0f, textView.getShadowRadius(), 0.0f); 612498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.RED, textView.getShadowColor()); 612572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 612672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 6127a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testFontFeatureSettings() throws Throwable { 6129354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6130354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.isEmpty(textView.getFontFeatureSettings())); 6131354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 61329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("smcp")); 6133354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6134354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("smcp", textView.getFontFeatureSettings()); 6135354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 61369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("frac")); 6137354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6138354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("frac", textView.getFontFeatureSettings()); 6139354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6140354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6141354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private static class SoftInputResultReceiver extends ResultReceiver { 6142354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private boolean mIsDone; 6143354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private int mResultCode; 6144354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6145354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public SoftInputResultReceiver(Handler handler) { 6146354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov super(handler); 6147354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6148354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6149354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov @Override 6150354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov protected void onReceiveResult(int resultCode, Bundle resultData) { 6151354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mResultCode = resultCode; 6152354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = true; 6153354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6154354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6155354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void reset() { 6156354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = false; 6157354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6158354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6159354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6160a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61614b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessShowSoftInputOnFocus() throws Throwable { 6162354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov if (!mActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS)) { 6163354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov return; 6164354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6165354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 616658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare a test Layout 616758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // will add an focusable TextView so that EditText will not get focus at activity start 616858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final TextView textView = new TextView(mActivity); 616958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusable(true); 617058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusableInTouchMode(true); 617158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // EditText to test 617258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final EditText editText = new EditText(mActivity); 617358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setShowSoftInputOnFocus(true); 617458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusable(true); 617558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusableInTouchMode(true); 617658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare and set the layout 617758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final LinearLayout layout = new LinearLayout(mActivity); 617858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.setOrientation(LinearLayout.VERTICAL); 617958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(textView, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 618058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 618158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(editText, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 618258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 618358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 618458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 618558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 6186354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6187354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 618858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(editText.getShowSoftInputOnFocus()); 6189354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6190354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And emulate click on it 619158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 6192354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6193354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Verify that input method manager is active and accepting text 6194354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final InputMethodManager imManager = (InputMethodManager) mActivity 6195354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .getSystemService(Context.INPUT_METHOD_SERVICE); 6196b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(imManager::isActive); 6197354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(imManager.isAcceptingText()); 619858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(imManager.isActive(editText)); 6199354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6200354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Since there is no API to check that soft input is showing, we're going to ask 6201354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // the input method manager to show soft input, passing our custom result receiver. 6202354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're expecting to get UNCHANGED_SHOWN, indicating that the soft input was already 6203354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // showing before showSoftInput was called. 6204354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov SoftInputResultReceiver receiver = new SoftInputResultReceiver(mHandler); 620558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 6206354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 6207354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_UNCHANGED_SHOWN, receiver.mResultCode); 6208354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6209354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 6210a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 6211354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6212354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Reconfigure our edit text to not show soft input on focus 621358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> editText.setShowSoftInputOnFocus(false)); 6214354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 621558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertFalse(editText.getShowSoftInputOnFocus()); 6216354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6217354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Emulate click on it 621858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 6219354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6220354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Ask input method manager to show soft input again. This time we're expecting to get 6221354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // SHOWN, indicating that the soft input was not showing before showSoftInput was called. 6222354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov receiver.reset(); 622358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 6224354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 6225354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_SHOWN, receiver.mResultCode); 6226354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6227354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 6228a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 6229354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6230354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6231a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 62324b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testIsSuggestionsEnabled() throws Throwable { 623341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 623441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 623541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything without InputType.TYPE_CLASS_TEXT doesn't have suggestions enabled 62364b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_DATETIME)); 623741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 623841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62394b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_PHONE)); 624041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 624141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62424b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_NUMBER)); 624341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 624441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 624541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // From this point our text view has InputType.TYPE_CLASS_TEXT 624641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 624741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything with InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS doesn't have suggestions enabled 62484b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 624941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 625041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 625141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 625241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62534b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 625441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 625541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | 625641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 625741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 625841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 626041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 626141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | 626241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 626341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 626441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 626541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Otherwise suggestions are enabled for specific type variations enumerated in the 626641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // documentation of TextView.isSuggestionsEnabled 62674b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 626841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 626941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL)); 627041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 627141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62724b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 627341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 627441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT)); 627541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 627641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62774b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 627841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 627941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE)); 628041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 628141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 628341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 628441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE)); 628541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 628641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62874b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 628841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 628941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT)); 629041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 629141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 629241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // and not on any other type variation 62934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 629441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 629541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)); 629641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 629741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 629941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 630041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER)); 630141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 630241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63034b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 630441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 630541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)); 630641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 630741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 630941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 631041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME)); 631141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 631241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 631441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 631541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC)); 631641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 631741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 631941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 632041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS)); 632141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 632241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63234b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 632441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 632541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI)); 632641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 632741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 632941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 633041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 633141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)); 633241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 633341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63344b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 633541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 633641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 633741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS)); 633841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 633941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63404b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 634141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 634241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD)); 634341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 634441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 634541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6346a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 63474b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessLetterSpacing() throws Throwable { 634841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 6349a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, mTextView.getLetterSpacing(), 0.0f); 635041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 635141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final CharSequence text = mTextView.getText(); 635241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int textLength = text.length(); 635341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 635441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at the default letter spacing 635541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] initialWidths = new float[textLength]; 635641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), initialWidths); 635741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 635841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 1.0f 63594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 636041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(1.0f)); 6361a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mTextView.getLetterSpacing(), 0.0f); 636241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] singleWidths = new float[textLength]; 636341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), singleWidths); 636441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 636541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 2.0f 63664b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 636741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(2.0f)); 6368a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, mTextView.getLetterSpacing(), 0.0f); 636941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] doubleWidths = new float[textLength]; 637041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), doubleWidths); 637141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 637241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Since letter spacing setter treats the parameter as EM units, and we don't have 637341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // a way to convert EMs into pixels, go over the three arrays of advance widths and 637441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // test that the extra advance width at letter spacing 2.0f is double the extra 637541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // advance width at letter spacing 1.0f. 637641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov for (int i = 0; i < textLength; i++) { 637741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float singleWidthDelta = singleWidths[i] - initialWidths[i]; 637841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float doubleWidthDelta = doubleWidths[i] - initialWidths[i]; 637941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("At index " + i + " initial is " + initialWidths[i] + 638041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov ", single is " + singleWidths[i] + " and double is " + doubleWidths[i], 638141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov singleWidthDelta * 2.0f, doubleWidthDelta, 0.05f); 638241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 638341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 638441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6385a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 63864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testTextIsSelectableFocusAndOnClick() throws Throwable { 6387288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // Prepare a focusable TextView with an onClickListener attached. 6388288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu final View.OnClickListener mockOnClickListener = mock(View.OnClickListener.class); 6389d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu final int safeDoubleTapTimeout = ViewConfiguration.getDoubleTapTimeout() + 1; 63909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6391288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView = new TextView(mActivity); 639252e5d256861edd0ff4f58da581b8bbd9df1c1d99Siyamed Sinir mTextView.setText("...text 11:11. some more text is in here..."); 6393288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setFocusable(true); 6394288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setOnClickListener(mockOnClickListener); 6395288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mActivity.setContentView(mTextView); 6396288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu }); 6397288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6398288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6399288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isTextSelectable()); 6400288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocusableInTouchMode()); 6401288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6402288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isInTouchMode()); 6403288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6404288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view triggers onClick() but does not focus the TextView. 64058bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6406d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6407288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6408288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6409288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6410288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6411d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // So does the second tap. 64128bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6413d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6414288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6415288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6416288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6417288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 64189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTextIsSelectable(true)); 6419288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6420288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6421288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isTextSelectable()); 6422288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusableInTouchMode()); 6423288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6424288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6425288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view focuses the TextView but does not trigger onClick(). 6426288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 64278bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6428d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6429288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6430288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6431288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, never()).onClick(mTextView); 6432288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6433d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // The second tap triggers onClick() and keeps the focus. 64348bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6435d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6436288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6437288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6438288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6439288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu } 6440288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 644141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov private void verifyGetOffsetForPosition(final int x, final int y) { 644241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int actual = mTextView.getOffsetForPosition(x, y); 644341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 644441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final Layout layout = mTextView.getLayout(); 644541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov if (layout == null) { 644641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", -1, actual); 644741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov return; 644841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 644941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 645041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the line which corresponds to the Y position 645141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int line = layout.getLineForVertical(y + mTextView.getScrollY()); 645241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the offset in that line that corresponds to the X position 645341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int expected = layout.getOffsetForHorizontal(line, x + mTextView.getScrollX()); 645441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", expected, actual); 645541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 645641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6457a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 64584b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetOffsetForPosition() throws Throwable { 645941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 64604b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, () -> { 646141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setText(LONG_TEXT); 646241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setPadding(0, 0, 0, 0); 646341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov }); 646441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 646541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertNotNull(mTextView.getLayout()); 646641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewWidth = mTextView.getWidth(); 646741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewHeight = mTextView.getHeight(); 646841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int lineHeight = mTextView.getLineHeight(); 646941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 647041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, 0); 647141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, viewHeight / 2); 647241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 3, lineHeight / 2); 647341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 2, viewHeight / 2); 647441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth, viewHeight); 647541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 647641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 647757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @UiThreadTest 6478a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 647957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void testOnResolvePointerIcon() throws InterruptedException { 648057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView selectableTextView = findTextView(R.id.textview_pointer); 648157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final MotionEvent event = createMouseHoverEvent(selectableTextView); 648257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 648357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable view shows the I beam 648457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 648557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 648657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 648757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 648857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(false); 648957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 649057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A clickable view shows the hand 649157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setLinksClickable(true); 649257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri SpannableString builder = new SpannableString("hello world"); 649357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setText(builder, BufferType.SPANNABLE); 649457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri Spannable text = (Spannable) selectableTextView.getText(); 649557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri text.setSpan( 649657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri new ClickableSpan() { 649757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @Override 649857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void onClick(View widget) { 649957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 650057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 650157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri }, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 650257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 650357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 650457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 650557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 650657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable & clickable view shows hand 650757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 650857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 650957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 651057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 651157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 651257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // An editable view shows the I-beam 651357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView editableTextView = new EditText(mActivity); 651457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 651557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 651657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri editableTextView.onResolvePointerIcon(event, 0)); 651757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 651857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 65199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65206b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapInside() throws Throwable { 65219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 65239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 65249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(1)).onClick(mTextView); 65259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65286b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDoubleTapInside() throws Throwable { 65299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDoubleTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 65319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 6532db34dc417570084e1598de3a6ebdacab4bbf1d66Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(2)).onClick(mTextView); 65339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65366b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapOutside() throws Throwable { 65379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosOutside, 65399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosOutside); 65409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 65419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65446b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDragOutside() throws Throwable { 65459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int[] viewOnScreenXY = new int[2]; 65479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLocationOnScreen(viewOnScreenXY); 65489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SparseArray<Point> swipeCoordinates = new SparseArray<>(); 65509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(0, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside, 65519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside)); 65529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(1, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside + 50, 65539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside + 50)); 65549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDragGesture(mInstrumentation, swipeCoordinates); 65559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 65569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 6558771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @UiThreadTest 6559771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 6560771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu public void testOnInitializeA11yNodeInfo_populatesHintTextProperly() { 6561771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6562771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText("", BufferType.EDITABLE); 6563771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String hintText = "Hint text"; 6564771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setHint(hintText); 6565771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); 6566771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6567771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6568771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not showing as accessibility text", 6569771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getText())); 6570771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6571771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6572771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6573771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String nonHintText = "Something else"; 6574771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText(nonHintText, BufferType.EDITABLE); 6575771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6576771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertFalse("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6577771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Text not provided to accessibility", 6578771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(nonHintText, info.getText())); 6579771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6580771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6581771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6582771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 65835b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu @Test 658476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testAutoSize_setEllipsize() throws Throwable { 658576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById( 658676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 658776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeType = textView.getAutoSizeTextType(); 658876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMinTextSize = textView.getAutoSizeMinTextSize(); 658976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMaxTextSize = textView.getAutoSizeMaxTextSize(); 659076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeGranularity = textView.getAutoSizeStepGranularity(); 659176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialSizes = textView.getAutoSizeTextAvailableSizes().length; 659276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 659376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(null, textView.getEllipsize()); 659476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Verify styled attributes. 659576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, initialAutoSizeType); 659676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMinTextSize); 659776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMaxTextSize); 659876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Because this TextView has been configured to use predefined sizes. 659976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, initialAutoSizeGranularity); 660076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, initialSizes); 660176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 660276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 660376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 660476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 660576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 660676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 660776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Beside the ellipsis no auto-size attribute has changed. 660876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeType, textView.getAutoSizeTextType()); 660976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMinTextSize, textView.getAutoSizeMinTextSize()); 661076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMaxTextSize, textView.getAutoSizeMaxTextSize()); 661176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeGranularity, textView.getAutoSizeStepGranularity()); 661276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialSizes, textView.getAutoSizeTextAvailableSizes().length); 661376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 661476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 661576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 661676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testEllipsize_setAutoSize() throws Throwable { 661776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu TextView textView = findTextView(R.id.textview_text); 661876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 661976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 662076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 662155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 662276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 662376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 662476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 662576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 662676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 662776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(0, textView.getAutoSizeTextAvailableSizes().length); 662876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 662976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 663076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 663155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 663276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 663376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 663476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // The auto-size defaults have been used. 663576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMinTextSize()); 663676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMaxTextSize()); 663776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeStepGranularity()); 663876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, textView.getAutoSizeTextAvailableSizes().length); 663976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 664076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 664176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 6642cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawables() throws Throwable { 6643069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66449000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6645069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6646cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6647c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6648cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6649cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setCompoundDrawables(drawable, drawable, drawable, drawable)); 6650cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6651069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6652069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6653cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6654cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6655cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6656cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablesRelative() throws Throwable { 6657069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66589000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6659069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6660cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6661c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6662cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablesRelative( 6663cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6664cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6665069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6666069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6667cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6668cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6669cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6670cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablePadding() throws Throwable { 6671069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66729000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6673cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // Prepare a larger layout in order not to hit the min value easily. 6674cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6675cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setWidth(autoSizeTextView.getWidth() * 2); 6676cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setHeight(autoSizeTextView.getHeight() * 2); 6677cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu }); 6678cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 6679cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Setup the drawables before setting their padding in order to modify the available 6680cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // space and trigger a resize. 6681cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6682cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 4, autoSizeTextView.getHeight() / 4); 6683cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawables( 6684cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6685cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6686069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6687cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablePadding( 6688cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.getCompoundDrawablePadding() + 10)); 6689cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6690069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6691069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6692cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6693cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6694cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6695cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPadding() throws Throwable { 6696069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 66979000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6698069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6699c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPadding( 6700c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6701c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6702cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6703069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6704069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6705cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6706cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6707cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6708cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPaddingRelative() throws Throwable { 6709069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67109000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6711069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6712cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6713c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPaddingRelative( 6714c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6715c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6716cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6717069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6718069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6719cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6720cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6721cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6722cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTextScaleX() throws Throwable { 6723069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67249000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6725069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6726cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6727cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6728069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX() * 4.5f)); 6729cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6730069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6731069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6732069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6733069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6734cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6735cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX())); 6736cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6737069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6738069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6739cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6740cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6741cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6742cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTypeface() throws Throwable { 6743069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67449000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6745069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6746069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setText("The typeface change needs a bit more text then " 6747069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the default used for this batch of tests in order to get to resize text." 6748069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + " The resize function is always called but even with different typefaces " 6749069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "there may not be a need to resize text because it just fits. The longer " 6750069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the text, the higher the chance for a resize. And here is yet another " 6751069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "sentence to make sure this test is not flaky. Not flaky at all.")); 6752069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6753069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6754cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6755c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6756c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu Typeface differentTypeface = Typeface.MONOSPACE; 6757c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu if (autoSizeTextView.getTypeface() == Typeface.MONOSPACE) { 6758c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu differentTypeface = Typeface.SANS_SERIF; 6759c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu } 6760c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setTypeface(differentTypeface); 6761c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu }); 6762cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6763069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6764069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6765069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Don't really know if it is larger or smaller (depends on the typeface chosen above), 6766069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // but it should definitely have changed. 6767069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertNotEquals(initialTextSize, changedTextSize, 0f); 6768069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6769cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6770cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTypeface(autoSizeTextView.getTypeface())); 6771cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6772069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6773069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6774cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6775cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6776cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6777cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLetterSpacing() throws Throwable { 6778069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67799000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6780069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6781cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6782cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6783c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // getLetterSpacing() could return 0, make sure there is enough of a difference to 6784c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // trigger auto-size. 6785c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setLetterSpacing( 6786069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLetterSpacing() * 1.5f + 4.5f)); 6787cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6788069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6789cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6790069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6791c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 6792cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6793069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setLetterSpacing(autoSizeTextView.getLetterSpacing())); 6794cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6795069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6796069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6797cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6798cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6799cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6800cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHorizontallyScrolling() throws Throwable { 6801069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68029000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6803697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu // Verify that we do not have horizontal scrolling turned on. 6804697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(!autoSizeTextView.getHorizontallyScrolling()); 6805697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu 6806069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6807697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(true)); 6808cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6809697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 6810069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6811697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(false)); 6812cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6813697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 6814cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6815cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6816cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6817cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxLines() throws Throwable { 6818069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68199000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6820069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6821cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(1)); 6822cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6823069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6824069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6825cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6826cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6827cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6828cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxHeight() throws Throwable { 6829069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68309000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6831069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6832069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6833069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6834069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6835069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6836069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6837069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6838c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxHeight( 6839069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6840cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6841069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6842069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6843cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6844cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6845cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6846cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHeight() throws Throwable { 6847069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68489000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6849069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6850069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6851069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6852069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6853069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6854069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6855069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6856c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 6857c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6858cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6859069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6860069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6861cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6862cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6863cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6864cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLines() throws Throwable { 6865069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68669000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6867069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6868069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLines(1)); 6869cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6870069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6871069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6872cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6873cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6874cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6875cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxWidth() throws Throwable { 6876069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68779000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6878cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width only. 6879cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6880cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 6881069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 6882cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6883cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6884069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6885c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxWidth( 6886c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 6887cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6888069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6889069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 6890cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6891cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6892cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6893cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setWidth() throws Throwable { 6894069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68959000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6896069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact width only. 6897069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6898069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 6899069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 6900069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6901069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6902cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6903069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6904c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setWidth( 6905c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 6906cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6907069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6908069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 6909cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6910cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6911cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6912cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLineSpacing() throws Throwable { 6913069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69149000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6915069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6916c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 6917cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 6918069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra() * 4, 6919069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier() * 4)); 6920cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6921069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6922069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6923069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6924069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6925cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 6926cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra(), 6927cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier())); 6928cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6929069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6930069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6931069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu } 6932069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6933069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu @Test 6934069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu public void testAutoSizeCallers_setTextSizeIsNoOp() throws Throwable { 6935069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69369000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6937069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6938069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6939069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setTextSize( 6940069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu initialTextSize + 123f)); 6941069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6942069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6943069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 6944cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6945cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6946cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 694755eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu public void testAutoSizeCallers_setHeightForOneLineText() throws Throwable { 694855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final TextView autoSizeTextView = (TextView) mActivity.findViewById( 694955eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu R.id.textview_autosize_basic); 695055eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, autoSizeTextView.getAutoSizeTextType()); 695155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 695255eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 695355eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu autoSizeTextView.getHeight() * 3)); 695455eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 695555eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 695655eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 695755eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu } 695855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 695955eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu @Test 69609000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributes() { 69615b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 69629000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 69639000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 69645b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 69659000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // The size has been set to 50dp in the layout but this being an AUTO_SIZE_TEXT_TYPE_UNIFORM 6966771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // TextView, the size is considered max size thus the value returned by getSize() in this 6967771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // case should be lower than the one set (given that there is not much available space and 6968771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // the font size is very high). In theory the values could be equal for a different TextView 69695b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu // configuration. 69705b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu final float sizeSetInPixels = TypedValue.applyDimension( 69715b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu TypedValue.COMPLEX_UNIT_DIP, 50f, metrics); 69729000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertTrue(autoSizeTextViewUniform.getTextSize() < sizeSetInPixels); 69735b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu } 69745b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 69754f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver @Test 69769000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesUsingPredefinedSizes() { 6977cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu DisplayMetrics m = mActivity.getResources().getDisplayMetrics(); 69789000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 69799000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 698055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 698155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 10px, 10dp, 10sp, 10pt, 10in and 10mm. 6982cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // TypedValue can not use the math library and instead naively ceils the value by adding 6983cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // 0.5f when obtaining styled attributes. Check TypedValue#complexToDimensionPixelSize(...) 6984cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu int[] expectedSizesInPx = new int[] { 6985cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 10f, m)), 6986cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, m)), 6987cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10f, m)), 6988cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 10f, m)), 6989cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 10f, m)), 6990cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10f, m))}; 6991cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu expectedSizesInPx = Arrays.stream(expectedSizesInPx) 699255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .filter(x -> x > 0) 699355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .distinct() 699455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .sorted() 699555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu .toArray(); 6996cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertArrayEquals(expectedSizesInPx, 6997cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 699855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 699955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu boolean containsValueFromExpectedSizes = false; 70009000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu int textSize = (int) autoSizeTextViewUniform.getTextSize(); 7001cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu for (int i = 0; i < expectedSizesInPx.length; i++) { 7002cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu if (expectedSizesInPx[i] == textSize) { 700355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu containsValueFromExpectedSizes = true; 700455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu break; 700555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 700655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 700755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(containsValueFromExpectedSizes); 700855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 700955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 701055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 70119000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesPredefinedSizesFiltering() { 70129000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 70139000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes_redundant_values); 701455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 701555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 40px, 10px, 10px, 10px, 0dp. 701655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] expectedSizes = new int[] {10, 40}; 70179000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(expectedSizes, autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 701855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 701955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 702055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 70219000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesFilteringAndSorting() throws Throwable { 702255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 702355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 702455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 702555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[] {400, 0, 10, 40, 10, 10, 0, 0}; 7026cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7027cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 702855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 70299000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(new int[] {10, 40, 400}, mTextView.getAutoSizeTextAvailableSizes()); 703055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 703155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 703255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test(expected = NullPointerException.class) 70339000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesNullArray() throws Throwable { 703455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 703555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 703655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 703755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = null; 7038cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7039cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 704055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 704155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 704255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 704355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 70449000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesEmptyArray() throws Throwable { 704555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 704655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 704755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 704855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7049cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 705055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 705155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 70529000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] defaultSizes = mTextView.getAutoSizeTextAvailableSizes(); 705355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 705455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(defaultSizes.length > 0); 705555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 705655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[0]; 7057cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7058cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 705955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 706055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 70619000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] newSizes = mTextView.getAutoSizeTextAvailableSizes(); 706255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 706355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals(defaultSizes, newSizes); 706455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 706555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 706655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 70679000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_buildsSizes() throws Throwable { 70689000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 70699000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 707055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 707155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // Verify that the interval limits are both included. 7072cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7073cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration(10, 20, 2, 7074cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 707555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 707655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 707755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 70789000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 707955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7080cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7081cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7082cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7083cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 19, 7084cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7085cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 708655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 708755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 708855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18}, 70899000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 709055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7091cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7092cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7093cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7094cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 21, 7095cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7096cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 709755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 709855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 709955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 71009000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 710155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 710255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 710355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 71049000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeTextDefaults() { 71054f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver final TextView textView = new TextView(mActivity); 7106771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7107771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max/Granularity values for auto-sizing are 0 because they are not used. 7108cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7109cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7110cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7111771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7112cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 71139000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7114771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max default values for auto-sizing XY have been loaded. 7115771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7116771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 711755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(0 < minSize); 7118771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue(minSize < maxSize); 711955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotEquals(0, textView.getAutoSizeStepGranularity()); 7120771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7121cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE); 7122771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7123771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max values for auto-sizing XY have been cleared. 7124cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7125cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7126cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7127771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7128771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7129771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 71309000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeStepGranularity() { 7131771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7132771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7133cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final int initialValue = -1; 7134771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(initialValue, textView.getAutoSizeStepGranularity()); 71354f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7136cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 71379000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7138771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int defaultValue = 1; // 1px. 71399000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // If the auto-size type is AUTO_SIZE_TEXT_TYPE_UNIFORM then it means textView went through 71409000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // the auto-size setup and given that 0 is an invalid value it changed it to the default. 7141771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(defaultValue, textView.getAutoSizeStepGranularity()); 7142771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7143771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newValue = 33; 7144cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7145cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7146cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7147cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newValue, 7148cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7149771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newValue, textView.getAutoSizeStepGranularity()); 7150771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7151771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7152771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 71539000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMinTextSize() { 7154771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7155cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 71569000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7157771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7158771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7159771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7160771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7161771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7162771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // This is just a test check to verify the next assertions. If this fails it is a problem 7163771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // of this test setup (we need at least 2 units). 7164771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue((maxSize - minSize) > 1); 7165771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMinSize = maxSize - 1; 7166cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7167cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7168cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7169cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7170cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7171cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7172771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMinSize, textView.getAutoSizeMinTextSize()); 7173771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Max size has not changed. 7174771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(maxSize, textView.getAutoSizeMaxTextSize()); 7175771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7176cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7177cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7178cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize + 10, 7179cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7180cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7181cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7182771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the min size, the getter always 7183771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 7184771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMinSize, 7185771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivity.getResources().getDisplayMetrics()), textView.getAutoSizeMinTextSize()); 7186771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7187771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7188cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 71899000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_throwsException_whenMaxLessThanMin() { 7190771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7191cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7192cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7193cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7194cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7195cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7196cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_minLessThanZero() { 7197cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7198cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7199cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu -1, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7200cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7201cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7202cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7203cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_maxLessThanZero() { 7204cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7205cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7206cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, -1, 1, TypedValue.COMPLEX_UNIT_SP); 7207cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7208cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7209cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7210cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_granularityLessThanZero() { 7211cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7212cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7213cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 20, -1, TypedValue.COMPLEX_UNIT_SP); 7214771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7215771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7216771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 72179000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMaxTextSize() { 7218771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7219cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 72209000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7221771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7222771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7223771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7224771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7225771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7226771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMaxSize = maxSize + 11; 7227cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7228cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7229cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7230cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7231cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7232cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7233771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMaxSize, textView.getAutoSizeMaxTextSize()); 7234771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min size has not changed. 7235771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(minSize, textView.getAutoSizeMinTextSize()); 7236cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7237cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7238cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7239cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7240cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7241771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the max size, the getter always 7242771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 7243771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMaxSize, 7244771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivity.getResources().getDisplayMetrics()), textView.getAutoSizeMaxTextSize()); 72454f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver } 72464f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7247771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 72489000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_autoSizeCalledWhenTypeChanged() throws Throwable { 7249771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 7250771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Make sure we pick an already inflated non auto-sized text view. 7251771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 7252771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Set the text size to a very low value in order to prepare for auto-size. 7253771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int customTextSize = 3; 7254771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7255771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, customTextSize)); 7256771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7257771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(customTextSize, mTextView.getTextSize(), 0f); 7258771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7259cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 7260771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7261771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // The size of the text should have changed. 7262771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(customTextSize, mTextView.getTextSize(), 0f); 7263771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 72644f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7265ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki @Test 7266ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki public void testSmartSelection() throws Throwable { 7267ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView = findTextView(R.id.textview_text); 7268ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 7269ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int startIndex = text.indexOf("president"); 7270ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int endIndex = startIndex + "president".length(); 727109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 7272ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 727309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 7274ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 727509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 727609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 727709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 7278ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // TODO: Test the floating toolbar content. 7279ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 728009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 728109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 728209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_dragSelection() throws Throwable { 728309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 728409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 728509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("is coming to town"); 728609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "is coming to town".length(); 728709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 728809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 728909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point start = getCenterPositionOfTextAt(mTextView, startIndex, startIndex); 729009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point end = getCenterPositionOfTextAt(mTextView, endIndex, endIndex); 729109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int[] viewOnScreenXY = new int[2]; 729209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.getLocationOnScreen(viewOnScreenXY); 729309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startX = start.x + viewOnScreenXY[0]; 729409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startY = start.y + viewOnScreenXY[1]; 729509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int offsetX = end.x - start.x; 729609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 729709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Perform drag selection. 729809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressAndDragGesture( 729909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mInstrumentation, startX, startY, offsetX, 0 /* offsetY */); 730009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 730109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // No smart selection on drag selection. 730209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(startIndex, mTextView.getSelectionStart()); 730309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(endIndex, mTextView.getSelectionEnd()); 730409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 730509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 730609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 730709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_resetSelection() throws Throwable { 730809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 730909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 731009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("president"); 731109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "president".length(); 731209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 731309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 731409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 731509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 731609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 731709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 731809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 731909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 73205a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap to reset selection. Expect tapped word to be selected. 73215a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki startIndex = text.indexOf("Filip"); 73225a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki endIndex = startIndex + "Filip".length(); 73235a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 732409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 73255a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selStart = startIndex; 73265a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selEnd = endIndex; 73275a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == selStart 73285a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki && mTextView.getSelectionEnd() == selEnd); 732909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 73305a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap one more time to dismiss the selection. 733109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 733209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertFalse(mTextView.hasSelection()); 733309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 733409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 73351f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73361f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlFamilyName() { 73371f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_fontfamily); 73381f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 73391f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73401f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73411f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 73421f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73431f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73441f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlFamilyName() { 73451f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 73461f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 73471f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73481f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73491f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 73501f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73511f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73521f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlStyle() { 73531f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_style); 73541f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 73551f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73561f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73571f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 73581f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73591f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73601f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlStyle() { 73611f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_style); 73621f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 73631f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73641f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73651f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 73661f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73671f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73681f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlTextAppearance() { 73691f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_textAppearance); 73701f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 73711f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73721f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73731f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 73741f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73751f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 73762d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri public void testFontResourcesXml_setInXmlWithStyle() { 73772d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 73782d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 73792d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 73802d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73812d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 73822d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_withStyle); 73832d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 73842d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface resultTypeface = mTextView.getTypeface(); 73852d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertNotEquals(resultTypeface, expected); 73862d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.create(expected, Typeface.ITALIC), resultTypeface); 73872d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.ITALIC, resultTypeface.getStyle()); 73882d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri } 73892d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 73902d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri @Test 73911f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlTextAppearance() { 73921f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_textAppearance); 73931f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 73941f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 73951f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 73961f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 7397ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 73985705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @Test 73995705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @MediumTest 74005705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri public void testFontResourcesXml_restrictedContext() 74015705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri throws PackageManager.NameNotFoundException { 74025705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context restrictedContext = mActivity.createPackageContext(mActivity.getPackageName(), 74035705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.CONTEXT_RESTRICTED); 74045705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri LayoutInflater layoutInflater = (LayoutInflater) restrictedContext.getSystemService( 74055705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.LAYOUT_INFLATER_SERVICE); 74065705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri View root = layoutInflater.inflate(R.layout.textview_restricted_layout, null); 74075705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 74085705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_fontfamily); 74095705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74105705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_fontfamily); 74115705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74125705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_nonFontReference); 74135705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74145705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_style); 74155705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74165705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_style); 74175705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74185705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_textAppearance); 74195705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74205705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_textAppearance); 74215705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 74225705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri } 74235705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 742409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void initializeTextForSmartSelection(CharSequence text) throws Throwable { 742509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertTrue(text.length() >= SMARTSELECT_END); 7426cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki initTextViewForTypingOnUiThread(); 742709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki TextClassifier mockClassifier = mock(TextClassifier.class); 742809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki when(mockClassifier.suggestSelection( 74295ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 743009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki .thenReturn(new TextSelection.Builder(SMARTSELECT_START, SMARTSELECT_END).build()); 74310ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Toki when(mockClassifier.classifyText( 74325ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 74330ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Toki .thenReturn(new TextClassification.Builder().build()); 7434cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mActivityRule.runOnUiThread(() -> { 7435cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setTextIsSelectable(true); 7436cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setText(text, BufferType.EDITABLE); 743709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.setTextClassifier(mockClassifier); 7438cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki }); 7439cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mInstrumentation.waitForIdleSync(); 744009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7441cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 744209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateClickOnView(View view, int offsetX, int offsetY) { 744309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateTapOnView(mInstrumentation, view, offsetX, offsetY); 744409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 744509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7446cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 744709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateLongPressOnView(View view, int offsetX, int offsetY) { 744809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressOnView(mInstrumentation, view, offsetX, offsetY); 744909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // TODO: Ideally, we shouldn't have to wait for a click timeout after a long-press but it 745009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // seems like we have a minor bug (call it inconvenience) in TextView that requires this. 745109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 7452cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki } 7453cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 74549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu /** 7455069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * Some TextView attributes require non-fixed width and/or layout height. This function removes 7456069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * all other existing views from the layout leaving only one auto-size TextView (for exercising 7457069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * the auto-size behavior) which has been set up to suit the test needs. 7458cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7459069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @param viewId The id of the view to prepare. 7460cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * @param shouldWrapLayoutContent Specifies if the layout params should wrap content 7461cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7462069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @return a TextView configured for auto size tests. 7463cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu */ 7464069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu private TextView prepareAndRetrieveAutoSizeTestData(final int viewId, 7465cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final boolean shouldWrapLayoutContent) throws Throwable { 7466cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7467cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 7468069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu TextView targetedTextView = (TextView) mActivity.findViewById(viewId); 7469cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu ll.removeAllViews(); 7470069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu ll.addView(targetedTextView); 7471cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu }); 7472cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7473cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7474069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById(viewId); 7475cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu if (shouldWrapLayoutContent) { 7476cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width or height. 7477cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7478cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7479cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 7480069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7481069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu textView.setLayoutParams(layoutParams); 7482069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu }); 7483cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7484cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7485cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7486069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu return textView; 7487cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7488cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7489cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu /** 74909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * Removes all existing views from the layout and adds a basic TextView (for exercising the 74919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * ClickableSpan onClick() behavior) in order to prevent scrolling. Adds a ClickableSpan to the 74929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * TextView and returns the ClickableSpan and position details about it to be used in individual 74939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * tests. 74949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu */ 74956b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu private ClickableSpanTestDetails prepareAndRetrieveClickableSpanDetails() throws Throwable { 74966b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 74979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 74989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.removeAllViews(); 74999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 75009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.addView(mTextView); 75019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 75029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 75039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mockTextLink = mock(ClickableSpan.class); 75059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu StringBuilder textViewContent = new StringBuilder(); 75069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu String clickableString = "clickMe!"; 75079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(clickableString); 75089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int startPos = 0; 75099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu // Insert more characters to make some room for swiping. 75119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu for (int i = 0; i < 200; i++) { 75129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(" text"); 75139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 75149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SpannableString spannableString = new SpannableString(textViewContent); 75159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int endPos = clickableString.length(); 75169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spannableString.setSpan(mockTextLink, startPos, endPos, 0); 75176b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 75189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(spannableString); 75199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 75209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 75219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 75229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu return new ClickableSpanTestDetails(mockTextLink, mTextView, startPos, endPos); 75249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 75259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private static final class ClickableSpanTestDetails { 75279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mClickableSpan; 75289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosInside; 75299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosInside; 75309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosOutside; 75319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosOutside; 75329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mStartCharPos; 75349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mEndCharPos; 75359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mParent; 75369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails(ClickableSpan clickableSpan, TextView parent, 75389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int startCharPos, int endCharPos) { 75399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mClickableSpan = clickableSpan; 75409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mParent = parent; 75419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mStartCharPos = startCharPos; 75429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mEndCharPos = endCharPos; 75439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu calculatePositions(); 75459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 75469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void calculatePositions() { 754800b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) mParent.getLayout().getPrimaryHorizontal(mStartCharPos, true); 754900b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) mParent.getLayout().getPrimaryHorizontal(mEndCharPos, true); 75509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int line = mParent.getLayout().getLineForOffset(mEndCharPos); 75519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yTop = mParent.getLayout().getLineTop(line); 75529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yBottom = mParent.getLayout().getLineBottom(line); 75539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 75549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosInside = (xStart + xEnd) / 2; 75559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosInside = (yTop + yBottom) / 2; 75569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosOutside = xEnd + 1; 75579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosOutside = yBottom + 1; 75589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 75599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 75609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 756157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri private MotionEvent createMouseHoverEvent(View view) { 756257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] xy = new int[2]; 756357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri view.getLocationOnScreen(xy); 756457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewWidth = view.getWidth(); 756557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewHeight = view.getHeight(); 756657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float x = xy[0] + viewWidth / 2.0f; 756757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float y = xy[1] + viewHeight / 2.0f; 756857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri long eventTime = SystemClock.uptimeMillis(); 756957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 757057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0] = new MotionEvent.PointerCoords(); 757157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].x = x; 757257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].y = y; 757357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] pointerIds = new int[1]; 757457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerIds[0] = 0; 757557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri return MotionEvent.obtain(0, eventTime, MotionEvent.ACTION_HOVER_MOVE, 1, pointerIds, 757657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords, 0, 0, 0, 0, 0, InputDevice.SOURCE_MOUSE, 0); 757757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 757857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 75799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final TextView textView) throws Throwable { 75809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(textView)); 7581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 75849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final int layoutId) throws Throwable { 75859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layoutId)); 7586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView findTextView(int id) { 7590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return (TextView) mActivity.findViewById(id); 7591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private int getAutoLinkMask(int id) { 7594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return findTextView(id).getAutoLinkMask(); 7595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 75979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxLines(final int lines) throws Throwable { 75989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxLines(lines)); 75996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 76006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 76016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 76029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxWidth(final int pixels) throws Throwable { 76039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxWidth(pixels)); 7604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinWidth(final int pixels) throws Throwable { 76089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinWidth(pixels)); 7609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxHeight(final int pixels) throws Throwable { 76139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxHeight(pixels)); 7614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinHeight(final int pixels) throws Throwable { 76189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinHeight(pixels)); 7619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinLines(final int minLines) throws Throwable { 76239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinLines(minLines)); 7624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And 7629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * the buffer type is fixed to SPANNABLE. 7630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * 7631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param tv the text view 7632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param content the content 7633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 76349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setSpannableText(final TextView tv, final String content) throws Throwable { 76359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> tv.setText(content, BufferType.SPANNABLE)); 7636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76394b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLines(final int lines) throws Throwable { 76409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLines(lines)); 7641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76444b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHorizontallyScrolling(final boolean whether) throws Throwable { 76459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHorizontallyScrolling(whether)); 7646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7647fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76494b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setWidth(final int pixels) throws Throwable { 76509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setWidth(pixels)); 7651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76544b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHeight(final int pixels) throws Throwable { 76559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHeight(pixels)); 7656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMinEms(final int ems) throws Throwable { 76609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinEms(ems)); 7661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76644b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMaxEms(final int ems) throws Throwable { 76659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxEms(ems)); 7666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7667fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7668fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76694b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setEms(final int ems) throws Throwable { 76709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setEms(ems)); 7671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 76744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLineSpacing(final float add, final float mult) throws Throwable { 76759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLineSpacing(add, mult)); 7676fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7679ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki /** 7680ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * Returns the x, y coordinates of text at a specified indices relative to the position of the 7681ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * TextView. 7682ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * 7683ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param textView 7684ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param startIndex start index of the text in the textView 7685ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param endIndex end index of the text in the textView 7686ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki */ 7687ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki private static Point getCenterPositionOfTextAt( 7688ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki TextView textView, int startIndex, int endIndex) { 768900b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) textView.getLayout().getPrimaryHorizontal(startIndex, true); 769000b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) textView.getLayout().getPrimaryHorizontal(endIndex, true); 7691ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int line = textView.getLayout().getLineForOffset(endIndex); 7692ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yTop = textView.getLayout().getLineTop(line); 7693ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yBottom = textView.getLayout().getLineBottom(line); 7694ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7695ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki return new Point((xStart + xEnd) / 2 /* x */, (yTop + yBottom) / 2 /* y */); 7696ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 7697ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestSelectedRunnable implements Runnable { 7699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected1; 7701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected2; 7702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestSelectedRunnable(TextView textview) { 7704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected1() { 7708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected1; 7709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected2() { 7712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected2; 7713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected1() { 7716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected1 = mTextView.isSelected(); 7717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected2() { 7720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected2 = mTextView.isSelected(); 7721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestLayoutRunnable implements Runnable { 7725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Layout mLayout; 7727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestLayoutRunnable(TextView textview) { 7729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public Layout getLayout() { 7733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mLayout; 7734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveLayout() { 7737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mLayout = mTextView.getLayout(); 7738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static class MockTextWatcher implements TextWatcher { 7742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledAfterTextChanged; 7743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledBeforeTextChanged; 7744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasOnTextChanged; 7745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void reset(){ 7747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = false; 7748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = false; 7749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = false; 7750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledAfterTextChanged() { 7753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledAfterTextChanged; 7754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledBeforeTextChanged() { 7757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledBeforeTextChanged; 7758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledOnTextChanged() { 7761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasOnTextChanged; 7762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void afterTextChanged(Editable s) { 7765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = true; 7766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = true; 7770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void onTextChanged(CharSequence s, int start, int before, int count) { 7773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = true; 7774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7778277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook * A TextWatcher that converts the text to spaces whenever the text changes. 7779277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook */ 7780277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook private static class ConvertToSpacesTextWatcher implements TextWatcher { 7781277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook boolean mChangingText; 7782277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7783277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7784277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7785277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7786277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7787277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7788277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void onTextChanged(CharSequence s, int start, int before, int count) { 7789277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7790277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7791277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7792277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void afterTextChanged(Editable s) { 7793277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Avoid infinite recursion. 7794277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook if (mChangingText) { 7795277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook return; 7796277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7797277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = true; 7798277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Create a string of s.length() spaces. 7799277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook StringBuilder builder = new StringBuilder(s.length()); 7800277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook for (int i = 0; i < s.length(); i++) { 7801277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook builder.append(' '); 7802277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7803277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook s.replace(0, s.length(), builder.toString()); 7804277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = false; 7805277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7806277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su} 7808