TextViewTest.java revision 4d8a2ce3fd2219dbab66941733e476bb1498adec
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; 48ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippovimport android.annotation.Nullable; 49fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity; 50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation; 51fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor; 52354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.content.Context; 53fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent; 542751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager; 55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList; 564d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikovimport android.content.res.Configuration; 57938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.content.res.Resources; 58fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException; 59fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color; 60fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint; 61afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path; 629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.graphics.Point; 63fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff; 64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect; 65afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF; 66fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface; 67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable; 68ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable; 69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable; 70a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournaderimport android.icu.lang.UCharacter; 71fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri; 72fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle; 73354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Handler; 74265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList; 75354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Looper; 765b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable; 77354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.ResultReceiver; 7857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.os.SystemClock; 79a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.InstrumentationRegistry; 80a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.annotation.UiThreadTest; 813763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.MediumTest; 823763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.SmallTest; 83a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.rule.ActivityTestRule; 84a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.runner.AndroidJUnit4; 85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable; 86fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter; 87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType; 88fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout; 89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection; 90fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable; 91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString; 92ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned; 93fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint; 94fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils; 95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt; 96afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher; 97fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod; 98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener; 99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener; 100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener; 101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener; 102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener; 103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod; 104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod; 105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod; 106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener; 107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod; 108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener; 109afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize; 110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener; 111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod; 11257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.text.style.ClickableSpan; 11398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan; 114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan; 115ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan; 116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify; 117ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippovimport android.util.AttributeSet; 118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics; 1199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.util.SparseArray; 120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue; 121ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode; 122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu; 123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity; 12457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.InputDevice; 125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent; 1265705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarriimport android.view.LayoutInflater; 12732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu; 12857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.MotionEvent; 12957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.PointerIcon; 130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View; 1319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewConfiguration; 132afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup; 1339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewGroup.LayoutParams; 13432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo; 13572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection; 13618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinirimport android.view.inputmethod.CompletionInfo; 13771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagiimport android.view.inputmethod.CorrectionInfo; 13872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo; 13972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText; 14072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest; 141c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection; 142354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.view.inputmethod.InputMethodManager; 1430ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Tokiimport android.view.textclassifier.TextClassification; 144ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextClassifier; 145ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextSelection; 146c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText; 147bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout; 14862808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout; 149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller; 150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView; 151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType; 152938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.widget.cts.util.TestUtils; 153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1549259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsKeyEventUtil; 1559259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsTouchUtils; 1569259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.PollingCheck; 1579259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.WidgetTestUtils; 1589259176007f5aad8fb9c79abb725b40c89327c40Aaron Holden 159a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Before; 160a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Rule; 161a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Test; 162a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.runner.RunWith; 163938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.invocation.InvocationOnMock; 164ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException; 165ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException; 167ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport java.lang.annotation.Retention; 16895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanuimport java.util.Arrays; 169b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale; 170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/** 172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}. 173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 174a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@MediumTest 175a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@RunWith(AndroidJUnit4.class) 176a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovpublic class TextViewTest { 177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Instrumentation mInstrumentation; 178a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private Activity mActivity; 179a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private TextView mTextView; 1809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mSecondTextView; 181a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final String LONG_TEXT = "This is a really long string which exceeds " 1837375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "the width of the view. New devices have a much larger screen which " 1847375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "actually enables long strings to be displayed with no fading. " 1857375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "I have made this string longer to fix this case. If you are correcting " 1867375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "this text, I would love to see the kind of devices you guys now use!"; 187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final long TIMEOUT = 5000; 18809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 18909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_START = 0; 19009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_END = 40; 19109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int CLICK_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 50; 19209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 19322d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root private CharSequence mTransformedText; 194354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private Handler mHandler = new Handler(Looper.getMainLooper()); 195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 196a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Rule 197a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public ActivityTestRule<TextViewCtsActivity> mActivityRule = 198a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov new ActivityTestRule<>(TextViewCtsActivity.class); 199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 200a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Before 201a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public void setup() { 202a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation = InstrumentationRegistry.getInstrumentation(); 203a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mActivity = mActivityRule.getActivity(); 204b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mActivity::hasWindowFocus); 205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 20728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook /** 2086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Promotes the TextView to editable and places focus in it to allow simulated typing. Used in 209a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov * test methods annotated with {@link UiThreadTest}. 21028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook */ 21128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook private void initTextViewForTyping() { 2126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 2146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 2156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 216ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // Disable smart selection 217ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 2186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu } 2196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 2206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu /** 2216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Used in test methods that can not entirely be run on the UiThread (e.g: tests that need to 2226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * emulate touches and/or key presses). 2236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu */ 2244b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void initTextViewForTypingOnUiThread() throws Throwable { 2254b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(this::initTextViewForTyping); 22628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mInstrumentation.waitForIdleSync(); 22728715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 22828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 229047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @UiThreadTest 230a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 231047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOnUiThread() { 232047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 233047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 235047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @Test 236047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOffUiThread() { 237047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 238047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 240047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu private void verifyConstructor() { 241047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity); 242047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity, null); 243938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, android.R.attr.textViewStyle); 244f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_TextView); 245f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_TextView); 246f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_TextView); 247938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_Light_TextView); 248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 251a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessText() { 253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String expected = mActivity.getResources().getString(R.string.text_view_hello); 256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(expected); 257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, tv.getText().toString()); 258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null); 260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 264a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineHeight() { 266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(1.2f, 1.5f); 270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 273a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLayout() throws Throwable { 2759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 2766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER); 278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) { 283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the text of TextView. 285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello, Android!"); 286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveLayout(); 287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 2899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(runnable.getLayout()); 292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 295a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2964b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessKeyListener() throws Throwable { 2979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getKeyListener()); 301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final KeyListener digitsKeyListener = DigitsKeyListener.getInstance(); 303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(digitsKeyListener)); 305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(digitsKeyListener, mTextView.getKeyListener()); 307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 3109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(qwertyKeyListener)); 311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(qwertyKeyListener, mTextView.getKeyListener()); 313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 315a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3164b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMovementMethod() throws Throwable { 317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified " 318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "coordinates, except constrains the X scrolling position to the horizontal " 319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "regions of the text that will be visible after scrolling to " 320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "the specified Y position."; 321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionStart = 10; 322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionEnd = LONG_TEXT.length(); 323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance(); 3249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 3266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(movementMethod); 3276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(LONG_TEXT, BufferType.EDITABLE); 3286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(movementMethod, mTextView.getMovementMethod()); 335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 337b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 338b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection has been removed. 340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText())); 342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(null); 3456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 354b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 355b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection will not be changed. 357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 362a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testLength() { 364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is content"; 367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content); 368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.length()); 369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(""); 371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 378a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessGravity() { 380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_gravity); 381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_default); 3834bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_bottom); 3864bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity()); 387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_right); 389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center); 392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_fill); 395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center_vertical_right); 398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity()); 399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity()); 402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL); 403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.NO_GRAVITY); 4084bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL_VERTICAL); 4144bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity()); 415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //test negative input value. 417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(-1); 418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getGravity()); 419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 421ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 422ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef({EditorInfo.IME_ACTION_UNSPECIFIED, EditorInfo.IME_ACTION_NONE, 423ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_SEND, 424ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, EditorInfo.IME_ACTION_DONE, EditorInfo.IME_ACTION_PREVIOUS}) 425ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionAction {} 426ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 427ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 428ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef(flag = true, 429ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa value = {EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING, 430ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN, EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS, 431ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT, EditorInfo.IME_FLAG_NO_EXTRACT_UI, 432ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION, EditorInfo.IME_FLAG_NO_ENTER_ACTION, 433ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII}) 434ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionFlags {} 435ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 436ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private static void assertImeOptions(TextView textView, 437ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionAction int expectedImeOptionAction, 438ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionFlags int expectedImeOptionFlags) { 439ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualAction = textView.getImeOptions() & EditorInfo.IME_MASK_ACTION; 440ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualFlags = textView.getImeOptions() & ~EditorInfo.IME_MASK_ACTION; 441ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionAction, actualAction); 442ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionFlags, actualFlags); 443ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 444ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 445ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @UiThreadTest 446ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Test 447ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa public void testImeOptions() { 448ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.setContentView(R.layout.textview_imeoptions); 449ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 450ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test "normal" to be a synonym EditorInfo.IME_NULL 451ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(EditorInfo.IME_NULL, 452ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.<TextView>findViewById(R.id.textview_imeoption_normal).getImeOptions()); 453ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 454ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_ACTION_* 455ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 456ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_unspecified), 457ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 0); 458ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 459ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_none), 460ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NONE, 0); 461ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 462ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_go), 463ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 0); 464ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 465ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_search), 466ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEARCH, 0); 467ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 468ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_send), 469ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEND, 0); 470ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 471ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_next), 472ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, 0); 473ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 474ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_done), 475ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_DONE, 0); 476ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 477ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_previous), 478ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_PREVIOUS, 0); 479ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 480ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_FLAG_* 481ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 482ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_personalized_learning), 483ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 484ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING); 485ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 486ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_fullscreen), 487ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 488ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN); 489ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 490ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_previous), 491ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 492ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS); 493ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 494ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_next), 495ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 496ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT); 497ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 498ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_extract_ui), 499ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 500ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_EXTRACT_UI); 501ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 502ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_accessory_action), 503ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 504ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION); 505ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 506ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_enter_action), 507ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 508ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ENTER_ACTION); 509ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 510ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_force_ascii), 511ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 512ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII); 513ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 514ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // test action + multiple flags 515ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 516ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById( 517ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa R.id.textview_imeoption_action_go_nagivate_next_no_extract_ui_force_ascii), 518ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 519ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI 520ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa | EditorInfo.IME_FLAG_FORCE_ASCII); 521ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 522ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 523a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5244b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessAutoLinkMask() throws Throwable { 525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text1 = 527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("URL: http://www.google.com. mailto: account@gmail.com"); 5289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.ALL); 5306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text1, BufferType.EDITABLE); 531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, mTextView.getAutoLinkMask()); 534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Spannable spanString = (Spannable) mTextView.getText(); 536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("http://www.google.com", spans[0].getURL()); 540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("mailto:account@gmail.com", spans[1].getURL()); 541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text2 = 543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("name: Jack. tel: +41 44 800 8999"); 5449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 5466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text2, BufferType.EDITABLE); 547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask()); 550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spanString = (Spannable) mTextView.getText(); 552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("tel:+41448008999", spans[0].getURL()); 556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_autolink); 558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone) 559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, getAutoLinkMask(R.id.autolink_default)); 560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web)); 561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email)); 562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone)); 563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all)); 564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES, 565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound1)); 566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, 567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound2)); 568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS, 569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound3)); 570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL, 571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound4)); 572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 575a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextSize() { 577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f); 581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics), 582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f); 585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics), 586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextSize by default unit "sp" 593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(20f); 594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(200f); 598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics), 599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 603a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextColor() { 605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.GREEN); 608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentTextColor()); 609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors()); 610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.BLACK); 612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors()); 614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.RED); 616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentTextColor()); 617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors()); 618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(colors); 625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getTextColors()); 626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(null); 631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should thrown exception if the colors is null"); 632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e){ 633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 636a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 637325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette public void testGetTextColor() { 638325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette // TODO: How to get a suitable TypedArray to test this method. 639325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 640325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette try { 641325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette TextView.getTextColor(mActivity, null, -1); 642325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette fail("There should be a NullPointerException thrown out."); 643325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } catch (NullPointerException e) { 644325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 645325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 646325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 647a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6484b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessHighlightColor() throws Throwable { 649354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 650354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 652354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setTextIsSelectable(true); 653354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setText("abcd", BufferType.EDITABLE); 654354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setHighlightColor(Color.BLUE); 655354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov }); 656354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 657354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 658354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(textView.isTextSelectable()); 659354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.BLUE, textView.getHighlightColor()); 660354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 661354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Long click on the text selects all text and shows selection handlers. The view has an 662354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // attribute layout_width="wrap_content", so clicked location (the center of the view) 663354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // should be on the text. 6649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, textView); 665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 666354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // At this point the entire content of our TextView should be selected and highlighted 667354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // with blue. Now change the highlight to red while the selection is still on. 6689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.RED)); 669354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 670354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 671354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.RED, textView.getHighlightColor()); 672354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 673354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 674354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Remove the selection 6759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) textView.getText())); 676354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 677354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 678354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And switch highlight to green after the selection has been removed 6799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.GREEN)); 680354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 681354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 682354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.GREEN, textView.getHighlightColor()); 683354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 687a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 688fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetShadowLayer() { 6896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test values 6906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final MockTextView mockTextView = new MockTextView(mActivity); 6916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 6926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.4f, Color.CYAN); 6936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(Color.CYAN, mockTextView.getShadowColor()); 694a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.3f, mockTextView.getShadowDx(), 0.0f); 695a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.4f, mockTextView.getShadowDy(), 0.0f); 696a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mockTextView.getShadowRadius(), 0.0f); 697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the left and below the text 6996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN); 7006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 7016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 7026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getRightPaddingOffset()); 7046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getBottomPaddingOffset()); 705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the right and above the text 7076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN); 7086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 7096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getLeftPaddingOffset()); 7106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getTopPaddingOffset()); 7116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 713fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // no shadow 7156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN); 7166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(mockTextView.isPaddingOffsetRequired()); 7176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 7186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 724a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSelectAllOnFocus() { 726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_selectallonfocus); 727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is the content"; 728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String blank = ""; 729fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.selectAllOnFocus_default); 730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content, BufferType.SPANNABLE); 741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.getSelectionEnd()); 750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(blank.length(), mTextView.getSelectionEnd()); 772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 786a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetPaint() { 788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextPaint tp = mTextView.getPaint(); 790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(tp); 791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaintFlags(), tp.getFlags()); 793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 796a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinksClickable() { 798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_true); 804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_false); 807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(false); 810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(true); 813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999"); 818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Movement method will be automatically set to LinkMovementMethod 823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod); 824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 827a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHintTextColor() { 829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using int values 831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.GREEN); 833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor()); 834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors()); 835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.BLUE); 837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors()); 838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor()); 839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.RED); 841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors()); 842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentHintTextColor()); 843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(colors); 850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getHintTextColors()); 851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor()); 852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(null); 855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHintTextColors()); 856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor()); 857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 860a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinkTextColor() { 862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.GRAY); 865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors()); 866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GRAY, mTextView.getPaint().linkColor); 867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.YELLOW); 869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors()); 870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.YELLOW, mTextView.getPaint().linkColor); 871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.WHITE); 873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors()); 874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.WHITE, mTextView.getPaint().linkColor); 875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_expanded}, new int[0] }, 878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(colors); 880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getLinkTextColors()); 881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(null); 884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLinkTextColors()); 885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 889a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessPaintFlags() { 891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 89253959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG 89353959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags()); 894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG); 896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG, 897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG); 900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG, 901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 904a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9054b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testHeight() throws Throwable { 906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 9076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalHeight = mTextView.getHeight(); 908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMaxHeight 9106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newHeight = originalHeight + 1; 9116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 9176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = Integer.MAX_VALUE; 9266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMinHeight 9316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 9336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // reset min and max height 947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(0); 948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setHeight 9516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight); 970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMaxHeight()); 9726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMinHeight()); 973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting max/min lines should cause getMaxHeight/getMinHeight to return -1 9756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxLines(2); 9766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting maxLines should return -1 fir maxHeight", 9776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMaxHeight()); 9786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinLines(1); 9806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting minLines should return -1 for minHeight", 9816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMinHeight()); 9826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 9836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 984a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9854b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testWidth() throws Throwable { 9866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = findTextView(R.id.textview_text); 9876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int originalWidth = mTextView.getWidth(); 9886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newWidth = mTextView.getWidth() / 8; 9906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 9916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 9926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 9936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Min Width 9966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 9976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(newWidth); 998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 9996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 1003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth - 1); 10049c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Width 10096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 10106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 1011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 10176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 10189c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 10226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting ems should cause getMaxWidth/getMinWidth to return -1 10246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setEms(1); 10256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMaxWidth()); 10266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMinWidth()); 1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1029a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10304b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMinEms() throws Throwable { 1031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10339c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu 10346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms + 1); 1038fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 103998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 104098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 1041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms - 1); 1043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 104498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 104598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 10466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(1); 10486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMinEms()); 1049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1050fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1051a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10524b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMaxEms() throws Throwable { 1053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1054fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1058fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1059fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms + 1); 1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 106298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 106398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms - 1); 1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 10676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 106898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 106998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 10706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxWidth(originalWidth); 10726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMaxEms()); 1073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1075a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10764b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetEms() throws Throwable { 1077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("check height", 1, mTextView.getLineCount()); 10796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms + 1); 1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 108598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 108698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 108798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 108898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms - 1); 1091fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((1 < mTextView.getLineCount())); 10926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 109398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 109498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 109598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 109698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 1097fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1098fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1099a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11004b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLineSpacing() throws Throwable { 11019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 11029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLineHeight = mTextView.getLineHeight(); 1104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float add = 1.2f; 1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float mult = 1.4f; 1108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 110992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 0.0f; 1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 111392e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // abnormal 1116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 111992e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = -1.4f; 1122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 112392e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 1.2f; 1125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 0.0f; 1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 112792e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // edge 1130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MIN_VALUE; 1131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MIN_VALUE; 1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1133ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1134ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette 1135ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // edge case where the behavior of Math.round() deviates from 1136ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // FastMath.round(), requiring us to use an explicit 0 value 1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MAX_VALUE; 1138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MAX_VALUE; 1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1140ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(0, mTextView.getLineHeight()); 1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1143a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11444b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetElegantLineHeight() throws Throwable { 1145ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView = findTextView(R.id.textview_text); 1146ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 11479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 11496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 11506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 1151ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 1152ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1153ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1154ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien int oldHeight = mTextView.getHeight(); 11559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(true)); 1156ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1157ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1158ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getPaint().isElegantTextHeight()); 1159ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() > oldHeight); 1160ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 11619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(false)); 1162ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1163ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 1164ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() == oldHeight); 1165ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 1166ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1167a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFreezesText() throws Throwable { 1169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_hint_linksclickable_freezestext); 1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 1172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_true); 1175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(false); 1181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = "Hello, TextView."; 11849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 1186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final URLSpan urlSpan = new URLSpan("ctstest://TextView/test"); 118872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1189a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov ActivityMonitor am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 11929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 11946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 11956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT); 1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(newActivity); 1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1201a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is removed. 1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 120472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 120572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(text.toString(), mTextView.getText().toString()); 1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(true); 1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 121272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1213a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 12176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 12186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 12196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 122207b9d3406e116f2f6b92932925783eed79503de0Mist Liao Activity oldActivity = newActivity; 122307b9d3406e116f2f6b92932925783eed79503de0Mist Liao while (true) { 122407b9d3406e116f2f6b92932925783eed79503de0Mist Liao newActivity = am.waitForActivityWithTimeout(TIMEOUT); 122507b9d3406e116f2f6b92932925783eed79503de0Mist Liao assertNotNull(newActivity); 122607b9d3406e116f2f6b92932925783eed79503de0Mist Liao if (newActivity != oldActivity) { 122707b9d3406e116f2f6b92932925783eed79503de0Mist Liao break; 122807b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 122907b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 1230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1231a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is still there. 1233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.toString(), mTextView.getText().toString()); 1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1238a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEditableFactory() { 1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 124398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Editable.Factory mockEditableFactory = spy(new Editable.Factory()); 124498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockEditableFactory).newEditable(any(CharSequence.class)); 124598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setEditableFactory(mockEditableFactory); 124698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 124898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 125298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 125698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 126098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(DigitsKeyListener.getInstance()); 126398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 126598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEditableFactory(null); 1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1275a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSpannableFactory() { 1277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Spannable.Factory mockSpannableFactory = spy(new Spannable.Factory()); 128198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockSpannableFactory).newSpannable(any(CharSequence.class)); 128298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setSpannableFactory(mockSpannableFactory); 128398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 128598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 128998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 129198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 129398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 129598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 129798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 130098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 130298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSpannableFactory(null); 1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1312a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextChangedListener() { 1314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher0 = new MockTextWatcher(); 1316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher1 = new MockTextWatcher(); 1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher0); 1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher1); 1320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called though the strings are same 1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called twice (The text is not 1345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Editable, so in Append() it calls setText() first) 1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("and appended"); 1347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Methods are not called if the string does not change 1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(""); 1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledBeforeTextChanged()); 1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledOnTextChanged()); 1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledAfterTextChanged()); 1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.removeTextChangedListener(watcher1); 1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1378a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetTextKeepState1() { 1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1); 1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, 4); 1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getSelectionEnd()); 1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1); 1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1428a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetEditableText() { 1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "Hello"; 1433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.EDITABLE); 1434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getEditableText().toString()); 1437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.SPANNABLE); 1439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.EDITABLE); 1444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getEditableText().toString()); 1447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.SPANNABLE); 1449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1455a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText2() { 1457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = "This is a test for setting text content by char array"; 1458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su char[] input = string.toCharArray(); 1459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, input.length); 1462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string, tv.getText().toString()); 1463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, 5); 1465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string.substring(0, 5), tv.getText().toString()); 1466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, -1, input.length); 1469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the start position is negative!"); 1470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, -1); 1475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the length is negative!"); 1476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, input.length); 1481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the end position is out of index!"); 1482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, 0); 1486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1490a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText1() { 1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), longString.length()); 1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1); 1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length() - 1, mTextView.getSelectionEnd()); 1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length()); 1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1590a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText3() { 1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId); 1598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1); 1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 1604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1607a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetTextUpdatesHeightAfterRemovingImageSpan() throws Throwable { 160998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // Height calculation had problems when TextView had width: match_parent 161098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT; 161198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final Spannable text = new SpannableString("some text"); 161298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int spanHeight = 100; 161398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 161498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // prepare TextView, width: MATCH_PARENT 16159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 16169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 16179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 16189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2); 16199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setPadding(0, 0, 0, 0); 16209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setIncludeFontPadding(false); 16219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 162298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 162398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth, 162498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 16259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 162698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.setLayoutParams(layoutParams); 16279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 1628a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 162998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 163098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height of text with no span 16319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithoutSpan = mTextView.getHeight(); 163298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be smaller than span height", 163398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan < spanHeight); 163498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 163598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // add ImageSpan to text 163698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery); 163798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir drawable.setBounds(0, 0, spanHeight, spanHeight); 163898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ImageSpan span = new ImageSpan(drawable); 163998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 16409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 164198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 164298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 164398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height with span 16449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithSpan = mTextView.getHeight(); 164598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be greater or equal than span height", 164698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithSpan >= spanHeight); 164798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 164898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // remove the span 164998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.removeSpan(span); 16509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 165198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 165298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 16539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightAfterRemoveSpan = mTextView.getHeight(); 165498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertEquals("Text height should be same after removing the span", 165598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan, heightAfterRemoveSpan); 165698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 165798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 1658a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRemoveSelectionWithSelectionHandles() throws Throwable { 16606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1661af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1662354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isTextSelectable()); 16639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 1664354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setTextIsSelectable(true); 1665354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setText("abcd", BufferType.EDITABLE); 1666af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1667af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1668354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isTextSelectable()); 1669af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1670af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Long click on the text selects all text and shows selection handlers. The view has an 1671af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // attribute layout_width="wrap_content", so clicked location (the center of the view) 1672af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // should be on the text. 16739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 1674af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 16759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) mTextView.getText())); 1676af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1677354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 1678354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", mTextView.getText())); 1679af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1680af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1681a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_insert() throws Throwable { 16836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 16845b51f77b99861d48fec1c327252416f726b3b01aJames Cook 16855b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text. 1686b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 16879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 16886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The cursor is at the end of the text. 16896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 16906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the typed string in one step. 16926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 16936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 16946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 16956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 16966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo restores the text and cursor position. 16976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 16986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 16996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo clears the text again. 17026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo when the undo stack is empty does nothing. 17066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17085b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17095b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 171028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17115b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1712a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 17134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_delete() throws Throwable { 17146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 17155b51f77b99861d48fec1c327252416f726b3b01aJames Cook 171628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Simulate deleting text and undoing it. 1717b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1718b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1719b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 17209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 17216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The text was actually deleted. 17226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo restores the typed string and cursor position in one step. 17266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo removes the text in one step. 17316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 17326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo restores the text again. 17366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing again undoes the original typing. 17416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17445b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17455b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 174628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17475b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1748c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Initialize the text view for simulated IME typing. Must be called on UI thread. 1749c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private InputConnection initTextViewForSimulatedIme() { 1750c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView = findTextView(R.id.textview_text); 175118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return initTextViewForSimulatedIme(mTextView); 175218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 175318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 175418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir private InputConnection initTextViewForSimulatedIme(TextView textView) { 175518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 175618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setText("", BufferType.EDITABLE); 175718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return textView.onCreateInputConnection(new EditorInfo()); 1758c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1759c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1760c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulates IME composing text behavior. 1761c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private void setComposingTextInBatch(InputConnection input, CharSequence text) { 1762c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1763c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText(text, 1); // Leave cursor at end. 1764c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1765c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1766c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1767c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1768a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1769c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertLatin() { 1770c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1771c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1772c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words, 1773c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // such as "c" -> "ca" -> "cat" -> "cat ". 1774c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "c"); 1775c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "ca"); 1776c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1777c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The completion and space are added in the same batch. 1778c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1779c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("cat", 1); 1780c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText(" ", 1); 1781c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1782c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1783c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements undo in a single step. 1784c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1785c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1786c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1787c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1788c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1789a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1790c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertJapanese() { 1791c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1792c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1793c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji. 1794c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1795c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String NA = "\u306A"; // HIRAGANA LETTER NA 1796c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1797c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1798c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1799c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + NA); 1800c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1801c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The result may be a surrogate pair. The composition ends in the same batch. 1802c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1803c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("\uD83C\uDF37", 1); // U+1F337 TULIP 1804c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText("", 1); 1805c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1806c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1807c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements are a single undo step. 1808c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1809c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1810c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1811c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1812c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1813a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 181471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeInsertAndDeleteLatin() { 181571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi InputConnection input = initTextViewForSimulatedIme(); 181671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 181771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 181871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 181971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 182071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "test"); 182171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 182271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 182371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 182471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 182571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 182671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.setComposingText("", 1); 182771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.finishComposingText(); 182871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 182971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 183071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 183171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("test", mTextView.getText().toString()); 183271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 183371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 183471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 183571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 183671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1837a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 183871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeAutoCorrection() { 183918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 184018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 184118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 184271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 184371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Start typing a composition. 184471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 184571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 184671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "teh"); 184771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 184818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CorrectionInfo correctionInfo = new CorrectionInfo(0, "teh", "the"); 184918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 185071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 185171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Auto correct "teh" to "the". 185218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCorrection(correctionInfo)); 185371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.commitText("the", 1); 185471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 185571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 185618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCorrection(refEq(correctionInfo)); 185718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 185818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("the", spiedTextView.getText().toString()); 185918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 186018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("teh", spiedTextView.getText().toString()); 186118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 186218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 186318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 186418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 186518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir @UiThreadTest 1866a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 186718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir public void testUndo_imeAutoCompletion() { 186818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 186918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 187018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 187118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 187218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Start typing a composition. 187318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "a"); 187418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "an"); 187518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "and"); 187618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 187718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CompletionInfo completionInfo = new CompletionInfo(0, 0, "android"); 187818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 187918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.beginBatchEdit(); 188018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Auto complete "and" to "android". 188118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCompletion(completionInfo)); 188218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.commitText("android", 1); 188318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.endBatchEdit(); 188418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 188518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCompletion(refEq(completionInfo)); 188618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 188718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("android", spiedTextView.getText().toString()); 188818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 188918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 189071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 189171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 189271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1893a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1894c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeCancel() { 1895c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1896c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1897c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1898c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Start typing a composition. 1899c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1900c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1901c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1902c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1903c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1904c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Cancel the composition. 1905c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, ""); 1906c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1907c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 190871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals(HA + "n" + "flower", mTextView.getText().toString()); 1909c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1910c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1911c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1912c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1913c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1914a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1915c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeEmptyBatch() { 1916c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1917c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1918c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1919c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Send an empty batch edit. This happens if the IME is hidden and shown. 1920c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1921c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1922c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1923c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1924c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1925c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1926c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1927c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1928c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1929c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1930a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19314b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_setText() throws Throwable { 19326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 193328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1934c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Create two undo operations, an insert and a delete. 1935b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1936b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1937b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 19389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears both undo operations, so undo doesn't happen. 19406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 19416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 19436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 19446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Clearing text programmatically does not undo either. 19456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 19466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1948277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1949277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1950277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 195128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1952a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19534b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRedo_setText() throws Throwable { 19546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1955277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1956277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. This creates an undo entry. 1957b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing to create a redo entry. 19606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 1961277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears the redo stack, so redo doesn't happen. 19636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 19646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 19656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 1966277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1967277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1968277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1969277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1970a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directAppend() throws Throwable { 19726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 197328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1974277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1975b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. 19786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("def"); 19796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abcdef", mTextView.getText().toString()); 1980277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the append as a separate step. 19826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 1984277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 19856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 19866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1988277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1989277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1990277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 1991277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1992a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directInsert() throws Throwable { 19946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1995277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1996277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 1997b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Directly modify the underlying Editable to insert some text. 20006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // NOTE: This is a violation of the API of getText() which specifies that the 20016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // returned object should not be modified. However, some apps do this anyway and 20026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // the framework needs to handle it. 20036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Editable text = (Editable) mTextView.getText(); 20046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu text.insert(0, "def"); 20056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("defabc", mTextView.getText().toString()); 20066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the insert as a separate step. 20086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 20126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2014277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2015277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2016277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 2017277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2019a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2020c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void testUndo_noCursor() { 2021c530472a02205f0b7d87f9f06140c56ca0849816James Cook initTextViewForTyping(); 2022c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Append some text to create an undo operation. There is no cursor present. 20246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("cat"); 2025c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Place the cursor at the end of the text so the undo will have to change it. 20276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 3); 2028c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the append. This should not crash, despite not having a valid cursor 20306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // position in the undo operation. 20316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 2032c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 2033c530472a02205f0b7d87f9f06140c56ca0849816James Cook 2034a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20354b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_textWatcher() throws Throwable { 20366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2037277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2038277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Add a TextWatcher that converts the text to spaces on each change. 2039277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2040277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2041277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 2042b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // TextWatcher altered the text. 20456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2046277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 20486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2050277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2051277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2052c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 2053c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2055a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2056c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void testUndo_textWatcherDirectAppend() { 2057c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook initTextViewForTyping(); 2058c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 2059c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Add a TextWatcher that converts the text to spaces on each change. 2060c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2061c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. The TextWatcher changes it to spaces. 20636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("abc"); 20646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2065c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 20676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 206928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 207028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 2071a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20724b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_shortcuts() throws Throwable { 20736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 207428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 207528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Type some text. 2076b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Z triggers undo. 20796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0, 20806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 20816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control)); 20826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 20836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Shift-Z triggers redo. 20856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 20866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON); 20876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift)); 20886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20895b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 20905b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 20915b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 20925b51f77b99861d48fec1c327252416f726b3b01aJames Cook 2093a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20944b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceState() throws Throwable { 20956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 20965b51f77b99861d48fec1c327252416f726b3b01aJames Cook 20975b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text to create an undo operation. 2098b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the TextView. 21016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21035b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21045b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21055b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21065b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Delete a character to create a new undo operation. 2107b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ab", mTextView.getText().toString()); 21105b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the delete. 21126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 21145b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing, which verifies that the original undo operation was parceled 21166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // correctly. 21176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21195f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the undo stack (which is empty but has been used and may 21216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // contain other state). 21226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21245f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21255f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21265f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 21275f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 2128a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceStateEmpty() throws Throwable { 21306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 21315f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21325f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Type and delete to create two new undo operations. 2133b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2134b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Empty the undo stack then parcel and unparcel the TextView. While the undo 21376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // stack contains no operations it may contain other state. 21386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21425f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21435f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21445f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21455f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Create two more undo operations. 2146b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2147b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Verify undo still works. 21506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("b", mTextView.getText().toString()); 21526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21545b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21555b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21565b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 21575b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2159a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2160b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCopyAndPaste() { 2161b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 21626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 21646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 21656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Copy "bc". 21676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 21686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 21696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "bc" between "b" and "c". 21716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 21726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abbccd", mTextView.getText().toString()); 21746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select entire text and paste "bc". 21766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 21776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 21786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bc", mTextView.getText().toString()); 2179b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2180b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2181a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCopyAndPaste_byKey() throws Throwable { 21836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 218449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 218549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2186b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 21879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 21896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 219049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 219149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 219249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Copy "bc" 2193b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_COPY); 219449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 21959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set cursor between 'b' and 'c'. 21976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 219849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 219949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 220049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2201b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 220249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("abbcc", mTextView.getText().toString()); 220349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 22076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON); 22086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + copy doesn't perform copy. 22096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcabbcc", mTextView.getText().toString()); 22136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 22176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + copy doesn't perform copy. 22186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcabbcc", mTextView.getText().toString()); 22226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 22266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + copy doesn't perform copy. 22276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcbcabbcc", mTextView.getText().toString()); 223149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 22328e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 223349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 223449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2236a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2237b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste() { 2238b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 22396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 22416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 22426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "bc". 22446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 22456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 22476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "ad". 22496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 2); 22506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 22526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "ad". 22546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 2256b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2257b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2258a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 22594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCutAndPaste_byKey() throws Throwable { 22606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 226149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 226249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2263b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 22649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 22666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 226749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 226849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 226949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Cut "bc" 2270b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_CUT); 227149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("a", mTextView.getText().toString()); 22746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Move cursor to the head 22756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 227649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 227749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 227849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2279b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 228049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 228149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 22836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 22856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON); 22866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + cut doesn't perform cut. 22876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 22886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 22896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 22916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 22926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + cut doesn't perform cut. 22936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 22946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 22956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 22976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 22986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + cut doesn't perform cut. 22996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 23006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 230149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 23022de5a65a1540ec0b1ed03ec75c49ff9c242331baSiyamed Sinir mInstrumentation.waitForIdleSync(); 230349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 230449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 2305b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) { 2306b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable)textView.getText(); 2307b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final int at = spannable.length() / 2; 2308b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi return spannable.getSpans(at, at, type).length > 0; 2309b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2310b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 23116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2312a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2313b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste_withAndWithoutStyle() { 2314b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 23156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("example", BufferType.EDITABLE); 23176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 23186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set URLSpan. 23206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Spannable spannable = (Spannable) mTextView.getText(); 23216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0); 23226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut entire text. 23256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 23276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 23286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste without style. 23306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText); 23316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text doesn't have URLSpan. 23336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste with style. 23366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 23386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text has URLSpan. 23406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2341b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2342b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2344a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 23454ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien public void testSaveInstanceState() { 2346baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // should save text when freezesText=true 23474ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView originalTextView = new TextView(mActivity); 23484ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 23494ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setText(text); 23504ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setFreezesText(true); // needed to actually save state 23514ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien Parcelable state = originalTextView.onSaveInstanceState(); 23524ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23534ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView restoredTextView = new TextView(mActivity); 23544ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien restoredTextView.onRestoreInstanceState(state); 23554ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien assertEquals(text, restoredTextView.getText().toString()); 23564ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 23574ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23584ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2359a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2360baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_whenFreezesTextIsFalse() { 23614ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 2362baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text when freezesText=false 2363baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2364baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2365baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2366baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 23674ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 2368baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2369baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2370baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2371baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2372baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2373baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2374baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2375baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2376baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2377baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text even when textIsSelectable=true 2378baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2379baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2380baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2381baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2382baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2383baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2384baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2385baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2386baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2387baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2388baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2389baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2390baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2391baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2392baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2393baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2394baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2395baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2396baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2397a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2398baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() { 2399baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2400baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2401baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2402baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2403baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2404baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2405baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2406baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2407baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2408baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2409baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2410baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2411baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionStart()); 2412baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionEnd()); 2413baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2414baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2415baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2416baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2417a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2418baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() { 2419baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2420baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2421baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2422baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2423baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2424baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2425baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2426baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2427baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2428baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2429baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2430baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2431baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2432baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2433baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2434baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2435baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir //when textIsSelectable, selection start and end are initialized to 0 2436baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionStart()); 2437baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionEnd()); 2438baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2439baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2440baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2441baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2442a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2443baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_savesSelectionWhenExists() { 2444baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2445baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2446baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2447baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2448baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2449baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2450baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2451baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2452baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2453baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2454baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2455baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2456baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2457baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2458baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2459baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart()); 2460baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd()); 24614ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 24624ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 24634ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2464a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText() { 2466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 2467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 2469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 2470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.EDITABLE); 2472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 2474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.SPANNABLE); 2476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 2478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1, BufferType.EDITABLE); 2481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 2482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2484fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2487a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHint() { 2489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 2490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 2492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHint()); 2493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_blank); 2495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getHint()); 2496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_string); 2498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint), 2499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_resid); 2502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hint), 2503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint("This is hint"); 2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("This is hint", mTextView.getHint().toString()); 2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(R.string.text_view_hello); 2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint().toString()); 2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Non-exist resid 2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(-1); 2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if id is illegal"); 2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2520a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 25214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessError() throws Throwable { 2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 252553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner final String errorText = "Oops! There is an error"; 2526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null)); 2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2531a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable icon = TestUtils.getDrawable(mActivity, R.drawable.failed); 25329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(errorText, icon)); 2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // can not check whether the drawable is set correctly 2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null, null)); 2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance("")); 25436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 25456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2551b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event that will not change the TextView's text 2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getText().toString()); 2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // The icon and error message will not be reset to null 255553b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner assertEquals(errorText, mTextView.getError().toString()); 2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance()); 25596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 25616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2562300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu }); 2563300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mInstrumentation.waitForIdleSync(); 2564300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu 2565b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "1"); 2566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event cause changes to the TextView's text 2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("1", mTextView.getText().toString()); 2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the error message and icon will be cleared. 2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2572a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 25734b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessFilters() throws Throwable { 2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final InputFilter[] expected = { new InputFilter.AllCaps(), 2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new InputFilter.LengthFilter(2) }; 2576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 25799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 25816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 25826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFilters(expected); 25846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(expected, mTextView.getFilters()); 2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2590b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("A", mTextView.getText().toString()); 2593b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2596b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "c"); 2597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 'C' could not be accepted, because there is a length filter. 2598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(null); 2602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw IllegalArgumentException!"); 2603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IllegalArgumentException e) { 2604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2607a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetFocusedRect() throws Throwable { 2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2611fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Basic 26129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2620fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Single line 2621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 262988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 263088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 263288b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 3, 13); 2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 2637fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien /* Cursor coordinates from getPrimaryHorizontal() may have a fractional 2638fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * component, while the result of getFocusedRect is in int coordinates. 2639fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * It's not practical for these to match exactly, so we compare that the 2640fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * integer components match - there can be a fractional pixel 2641fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * discrepancy, which should be okay for all practical applications. */ 2642fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left); 2643fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right); 2644fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2645fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2646fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 264888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 264988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 265188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 13, 3); 2652fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2653fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2654fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2655fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2656fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left); 2657fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right); 2658fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2659fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2660fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2661fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Multi lines 2662fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView = findTextView(R.id.textview_text_two_lines); 2663fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2664fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX(), rc.left); 2665fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2666fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY(), rc.top); 2667fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2668fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 267088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 267188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 267388b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 4); 2674fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2675fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2676fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2677fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2678fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left); 2679fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right); 2680fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2681fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2682fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 268488b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 268588b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 268788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir // cross the "\n" and two lines 268888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 10); 2689fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2690fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2691fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2692fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Path path = new Path(); 2693fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getLayout().getSelectionPath(2, 10, path); 2694fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio RectF rcf = new RectF(); 2695fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio path.computeBounds(rcf, true); 2696fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2697a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.left - 1, (float) rc.left, 0.0f); 2698a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.right + 1, (float) rc.right, 0.0f); 2699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2700fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom); 2701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Exception 2703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(null); 2705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 2706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2708fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2709fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2710a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetLineCount() throws Throwable { 27129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 27139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // this is an one line text with default setting. 2715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2716fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2717fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multi-lines 2718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(mTextView.getWidth() / 3); 2719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 2720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2721fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it to an one line 2722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(Integer.MAX_VALUE); 2723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set min lines don't effect the lines count for actual text. 2726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(12); 2727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the internal Layout has not been built. 2732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLayout()); 2733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineCount()); 2734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2736a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27374b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLineBounds() throws Throwable { 2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 27399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, null)); 2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, rc)); 2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.right); 2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.bottom); 2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null)); 2751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth(), rc.right); 2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight(), rc.bottom); 2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingLeft(), rc.left); 2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right); 2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingTop(), rc.top); 2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom); 2768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2770a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetBaseLine() throws Throwable { 27729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getBaseline()); 2775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline()); 2778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0); 2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getBaseline()); 2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2788a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27894b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testPressKey() throws Throwable { 27906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2792b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2794b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("ab", mTextView.getText().toString()); 2796b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 2797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2800a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2801aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky public void testKeyNavigation() throws Throwable { 2802aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky initTextViewForTypingOnUiThread(); 2803aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivityRule.runOnUiThread(() -> { 2804aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_singleLine).setFocusableInTouchMode(true); 2805aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_text_two_lines).setFocusableInTouchMode(true); 2806aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 2807aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setText("abc"); 2808aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setFocusableInTouchMode(true); 2809aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky }); 2810aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2811aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.requestFocus(); 2812aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2813aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2814aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2815fe49a004799c033138db0bb86990083d91e64521Evan Rosky // Pure-keyboard arrows should not cause focus to leave the textfield 2816aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP); 2817aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2818aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2819aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2820fe49a004799c033138db0bb86990083d91e64521Evan Rosky // Non-pure-keyboard arrows, however, should. 2821fe49a004799c033138db0bb86990083d91e64521Evan Rosky int dpadRemote = InputDevice.SOURCE_DPAD | InputDevice.SOURCE_KEYBOARD; 2822fe49a004799c033138db0bb86990083d91e64521Evan Rosky sendSourceKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP, dpadRemote); 2823fe49a004799c033138db0bb86990083d91e64521Evan Rosky mInstrumentation.waitForIdleSync(); 2824fe49a004799c033138db0bb86990083d91e64521Evan Rosky assertFalse(mTextView.isFocused()); 2825fe49a004799c033138db0bb86990083d91e64521Evan Rosky 2826fe49a004799c033138db0bb86990083d91e64521Evan Rosky sendSourceKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_DOWN, dpadRemote); 2827aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2828aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2829aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2830aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Tab should 2831aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_TAB); 2832aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2833aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertFalse(mTextView.isFocused()); 2834aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky } 2835aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2836fe49a004799c033138db0bb86990083d91e64521Evan Rosky private void sendSourceKeyDownUp(Instrumentation instrumentation, View targetView, int key, 2837fe49a004799c033138db0bb86990083d91e64521Evan Rosky int source) { 2838fe49a004799c033138db0bb86990083d91e64521Evan Rosky KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, key); 2839fe49a004799c033138db0bb86990083d91e64521Evan Rosky event.setSource(source); 2840fe49a004799c033138db0bb86990083d91e64521Evan Rosky CtsKeyEventUtil.sendKey(instrumentation, targetView, event); 2841fe49a004799c033138db0bb86990083d91e64521Evan Rosky event = new KeyEvent(KeyEvent.ACTION_UP, key); 2842fe49a004799c033138db0bb86990083d91e64521Evan Rosky event.setSource(source); 2843fe49a004799c033138db0bb86990083d91e64521Evan Rosky CtsKeyEventUtil.sendKey(instrumentation, targetView, event); 2844fe49a004799c033138db0bb86990083d91e64521Evan Rosky } 2845fe49a004799c033138db0bb86990083d91e64521Evan Rosky 2846aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky @Test 28474b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetIncludeFontPadding() throws Throwable { 2848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2849ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getIncludeFontPadding()); 28509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 28526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 28536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int oldHeight = mTextView.getHeight(); 28589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setIncludeFontPadding(false)); 2859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() < oldHeight); 2862ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getIncludeFontPadding()); 2863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 28659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2866a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testScroll() { 2868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //don't set the Scroller, nothing changed. 2874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the Scroller 2879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Scroller s = new Scroller(mActivity); 2880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(s); 2881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.startScroll(0, 0, 320, 480, 0); 2882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.abortAnimation(); 2883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.forceFinished(false); 2884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setScroller(s); 2885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, mTextView.getScrollX()); 2888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, mTextView.getScrollY()); 2889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2891a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDebug() throws Throwable { 28939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 28959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.debug(0); 28969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("Hello!"); 28979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 28989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(mTextView); 2901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(1); 2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 29049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2905a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSelection() throws Throwable { 2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "This is the content"; 2909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 2910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.selectAll((Spannable) mTextView.getText()); 2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.length(), mTextView.getSelectionEnd()); 2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionStart = 5; 2918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionEnd = 7; 2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart); 2920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionEnd()); 2922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); 2925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, mTextView.getSelectionEnd()); 2927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2930a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testOnSelectionChangedIsTriggeredWhenSelectionChanges() throws Throwable { 29326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String text = "any text"; 29339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 29349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 29359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 29366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // assert that there is currently no selection 29389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(mTextView.hasSelection()); 29396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // select all 29419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 2942b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // After selectAll OnSelectionChanged should have been called 29439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(0, text.length()); 29446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // change selection 29479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 5); 29489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(1, 5); 29496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // clear selection 29529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.removeSelection((Spannable) mTextView.getText()); 29539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(-1, -1); 29546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 29556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2957a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessEllipsize() { 2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_ellipsize); 2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_default); 2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_none); 2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_start); 2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.START, mTextView.getEllipsize()); 2969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_middle); 2971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize()); 2972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_end); 2974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.END, mTextView.getEllipsize()); 2975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); 2980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize()); 2981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.END); 2983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize()); 2984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(null); 2986fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 2987fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(10); 2989fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 2990fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord"); 2991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.invalidate(); 2992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 2994fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no method to check if '...yLongVeryLongWord' is painted in the screen. 2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2997a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 299892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForSingleLine() throws Throwable { 299992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline or ellipsize set, single line text 300092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 300192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 300292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a"); 300392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 300492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with two lines 300592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 300692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(1); 300792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 300892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na"); 300992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 301092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with two lines 301192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 301292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 301392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(1); 301492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 301592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na"); 30162deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 301792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 301892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 301992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 302092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 302192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 302292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 302392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 302492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 302592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 302692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 302792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 302892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 30299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 30302deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 303192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 303292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 303392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 303492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 303592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 303692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(0)); 303792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 303892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 303992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(0)); 304092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 304192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 304292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir @Test 304392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForMultiLine() throws Throwable { 304492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, text with two lines 304592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 304692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 304792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a\na"); 304892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 304992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with three lines 305092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 305192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 305292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 305392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na\na"); 305492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 305592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with three lines 305692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 305792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 305892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 305992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 306092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na\na"); 30616031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 30622deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 30632deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 306492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 306592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 30662deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 306792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 306892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 306992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 307092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 307192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 307292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 307392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 307492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3075a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 30762deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 307792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 307892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 307992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 308092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 308192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) { 308292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 308392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 308492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(i)); 308592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 308692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 308792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 308892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(i)); 308992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 30902deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 30912deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 3092a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 309392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForHint() throws Throwable { 309492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with two lines 309592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvTwoLines = new TextView(mActivity); 309692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setLineSpacing(0, 1.5f); 309792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setHint("a\na"); 30982deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 309992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with three lines 310092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvThreeLines = new TextView(mActivity); 310192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setLineSpacing(0, 1.5f); 310292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setHint("a\na\na"); 310392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 310492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, hint with three lines 310592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 310692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 310792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 310892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 310992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setHint("a\na\na"); 31102deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 311192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, hint with three lines 311292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 311392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 311492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 311592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setHint("a\na\na"); 31166031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 31172deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 31182deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 311992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 312092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 31212deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 312292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvTwoLines, layoutParams); 312392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 312492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 312592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvThreeLines, layoutParams); 31262deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 312792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 312892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 312992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 313092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3131a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 31322deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 313392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Non-ellipsized hint should not crop text at maxLines", 313492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.getHeight(), tvEllipsizeNone.getHeight()); 313592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 313692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Ellipsized hint should crop text at maxLines", 313792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.getHeight(), tvEllipsizeEnd.getHeight()); 31382deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 31392deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 31409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3141a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3142354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void testAccessCursorVisible() { 3143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(true); 3146354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isCursorVisible()); 3147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(false); 3148354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isCursorVisible()); 3149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3152a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPerformLongClick() { 3154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("This is content"); 3156938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3157938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnLongClickListener mockOnLongClickListener = mock(View.OnLongClickListener.class); 3158938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.TRUE); 3159938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3160938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnCreateContextMenuListener mockOnCreateContextMenuListener = 3161938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mock(View.OnCreateContextMenuListener.class); 31624e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov doAnswer((InvocationOnMock invocation) -> { 31634e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov ((ContextMenu) invocation.getArguments() [0]).add("menu item"); 31644e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov return null; 3165938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov }).when(mockOnCreateContextMenuListener).onCreateContextMenu( 316627c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3167938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3168938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnLongClickListener(mockOnLongClickListener); 3169938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener); 3170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3171938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3172938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyZeroInteractions(mockOnCreateContextMenuListener); 3173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3174938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnLongClickListener); 3175938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.FALSE); 3176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3177938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3178938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 317927c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3181938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnCreateContextMenuListener); 3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setOnLongClickListener(null); 3183938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu( 318427c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.performLongClick()); 3186938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyNoMoreInteractions(mockOnLongClickListener); 3187938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 318827c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3192a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextAttr() { 3194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_textAttr); 3195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getText 3196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString()); 3197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getCurrentTextColor 3199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHintTextColors().getDefaultColor()); 3205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextScaleX 3209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f); 3210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextScaleX 3212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(2.4f); 3213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f); 3214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(0f); 3216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0f, mTextView.getTextScaleX(), 0.01f); 3217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(- 2.4f); 3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f); 3220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextSize 3222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 3223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTypeface 3225119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson // getTypeface will be null if android:typeface is set to normal, 3226c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // and android:style is not set or is set to normal, and 3227c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // android:fontFamily is not set 3228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT); 3231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.DEFAULT, mTextView.getTypeface()); 3232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face 3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null); 3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // default type face, bold style, note: the type face will be changed 3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // after call set method 3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); 3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face, BOLD style 3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null, Typeface.BOLD); 3243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // old type face, null style 3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, 0); 3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3251a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAppend() { 3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1: check the original length, should be blank as initialised. 3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getText().length()); 3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 2: append a string use append(CharSquence) into the original blank 3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was 3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // not already editable. 3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getText() instanceof Editable); 3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append."); 3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.", mTextView.getText().toString()); 3264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 3: append a string from 0~3. 3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 3); 3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 4: append a string from 0~0, nothing will be append as expected. 3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 0); 3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 5: append a string from -3~3. check the wrong left edge. 3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", -3, 3); 3279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 6: append a string from 3~10. check the wrong right edge. 3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 3, 10); 3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 7: append a null string. 3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(null); 3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException"); 3294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 3295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3298f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3299a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3300f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() { 3301f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3302f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3303f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3304f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3305f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" another text without URL"); 3306f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3307f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3308f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3309f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3310f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL another text without URL", text.toString()); 3311f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3312f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3313f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3314a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3315f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() { 3316f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3317f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3318f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3319f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3320f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3321f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3322f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3323f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3324f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3325f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3326f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3327f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3328a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3329f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenAutoLinkIsEnabled() { 3330f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3331f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3332f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3333f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3334f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3335f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3336f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3337f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3338f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3339f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3340f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3341f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3342f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3343f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3344f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3345a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3346f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() { 3347f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3348f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3349f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with URL http://android.com/before"); 3350f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3351f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3352f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3353f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3354f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3355f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length); 3356f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("First URLSpan URL should be same", 3357f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/before"); 3358f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3359f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[1].getURL(), "http://android.com"); 3360f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text with URL http://android.com/before text with URL http://android.com", 3361f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir text.toString()); 3362f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3363f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3364f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3365a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3366f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() { 3367f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3368f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3369f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3370f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3371f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with a url: http://android.com"); 3372f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3373f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertNotNull("MovementMethod should not be null when text contains url", 3374f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod()); 3375f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url", 3376f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod() instanceof LinkMovementMethod); 3377f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3378f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3379f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3380a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3381f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() { 3382f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3383f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3384f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3385f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3386f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(new SpannableString(" text with a url: http://android.com")); 3387f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3388f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3389f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3390f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3391f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3392f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3393f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3394f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3395f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3396a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3397f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() { 3398f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3399f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3400f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a partial url android."); 3401f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3402f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("com"); 3403f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3404f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3405f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3406f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending to partial URL", 3407f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 1, urlSpans.length); 3408f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3409f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3410f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3411f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3412f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3413a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3414f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() { 3415f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3416f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3417f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a url http://android.com"); 3418f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3419f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("/textview"); 3420f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3421f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3422f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3423f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length); 3424f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the new URL", 3425f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/textview"); 3426f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3427f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 34289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3429a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetLetterSpacing_returnsValueThatWasSet() { 34316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 34326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLetterSpacing(2f); 34336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getLetterSpacing should return the value that was set", 3434a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 2f, mTextView.getLetterSpacing(), 0.0f); 34356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3437a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetLetterSpacingChangesTextWidth() throws Throwable { 34399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 34409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 34419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("aa"); 34429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLetterSpacing(0f); 34439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 34449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 34459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 34466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 34486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 34496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 34506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 34519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 34526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 34536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3455a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with zero letter spacing 34589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float zeroSpacing = mTextView.getLayout().getLineWidth(0); 34596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(1f)); 3461a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with single letter spacing 34649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float singleSpacing = mTextView.getLayout().getLineWidth(0); 34656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(2f)); 3467a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with double letter spacing 34709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float doubleSpacing = mTextView.getLayout().getLineWidth(0); 34716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Double spacing should have two times the spacing of single spacing", 34736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir doubleSpacing - zeroSpacing, 2f * (singleSpacing - zeroSpacing), 1f); 34746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3477a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetFontFeatureSettings_returnsValueThatWasSet() { 34796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 34806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setFontFeatureSettings("\"smcp\" on"); 34816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getFontFeatureSettings should return the value that was set", 34826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir "\"smcp\" on", mTextView.getFontFeatureSettings()); 34836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 348577030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @UiThreadTest 348677030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @Test 3487751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka public void testSetGetFontVariationSettings() { 348877030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView = new TextView(mActivity); 3489a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Context context = InstrumentationRegistry.getTargetContext(); 3490a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Typeface typeface = Typeface.createFromAsset(context.getAssets(), "multiaxis.ttf"); 3491a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setTypeface(typeface); 349277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3493a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // multiaxis.ttf supports "aaaa", "BBBB", "a b ", " C D" axes. 3494a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3495a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // The default variation settings should be null. 349677030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 349777030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 34980d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] invalidFormatSettings = { 3499a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "invalid syntax", 3500a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaa' 1.0", // tag is not 4 ascii chars 35010d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka }; 35020d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka for (String settings : invalidFormatSettings) { 35030d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka try { 35040d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.setFontVariationSettings(settings); 35050d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka fail(); 3506751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka } catch (IllegalArgumentException e) { 35070d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka // pass. 35080d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 35090d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka assertNull("Must not change settings for " + settings, 35100d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.getFontVariationSettings()); 35110d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 35120d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka 35130d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] nonEffectiveSettings = { 3514a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0", // unsupported tag 3515a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' ' 1.0", // unsupported tag 3516a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'AAAA' 0.7", // unsupported tag (case sensitive) 3517a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' a b' 1.3", // unsupported tag (white space should not be ignored) 3518a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'C D ' 1.3", // unsupported tag (white space should not be ignored) 3519a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0, 'cccc' 2.0", // none of them are supported. 3520a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3521a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3522a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3523a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse("Must return false for " + notEffectiveSetting, 3524a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setFontVariationSettings(notEffectiveSetting)); 3525a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertNull("Must not change settings for " + notEffectiveSetting, 3526a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.getFontVariationSettings()); 3527a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3528a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3529a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka String retainSettings = "'aaaa' 1.0"; 3530a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(retainSettings)); 3531a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3532a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse(mTextView.setFontVariationSettings(notEffectiveSetting)); 3533a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals("Must not change settings for " + notEffectiveSetting, 3534a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka retainSettings, mTextView.getFontVariationSettings()); 3535a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3536a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3537a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // At least one axis is supported, the settings should be applied. 3538a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka final String[] effectiveSettings = { 3539a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0", // supported tag 3540a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'a b ' .7", // supported tag (contains whitespace) 3541a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'BBBB' 0.5", // both are supported 3542a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, ' C D' 0.5", // both are supported 3543a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'bbbb' 0.4", // 'bbbb' is unspported. 3544a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3545a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3546a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String effectiveSetting : effectiveSettings) { 3547a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(effectiveSetting)); 3548a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals(effectiveSetting, mTextView.getFontVariationSettings()); 3549a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 355077030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 355177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView.setFontVariationSettings(""); 355277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 355377030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka } 355477030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3555a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionSingleLineLtr() throws Throwable { 35576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // asserts getOffsetPosition returns correct values for a single line LTR text 35589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final String text = "aaaaa"; 355991f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 35609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 35619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 35629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 35639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 35649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 35659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 35669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 35676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3569a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 35706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 35719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 35726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 35746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 35756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 35766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 35779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 35786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 35796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35804b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3581023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 35826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 358391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final float halfCharWidth = (float) Math.ceil(mTextView.getPaint().measureText("a") / 2f); 358491f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 358591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingLeft = mTextView.getTotalPaddingLeft(); 358691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 35876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int firstOffset = 0; 35886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int lastOffset = text.length() - 1; 35896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int midOffset = text.length() / 2; 35906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view 35926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 359391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = mTextView.getHeight() / 2f + paddingTop; 35949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 35956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text 359791f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getLayout().getLineWidth(0) + paddingLeft - halfCharWidth; 35989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset, mTextView.getOffsetForPosition(x, y)); 35996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view 36019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth(); 36029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset + 1, mTextView.getOffsetForPosition(x, y)); 36036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view - out of bounds 36056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = -1f; 36069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 36076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text 360991f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getLayout().getLineWidth(0) / 2f + paddingLeft - halfCharWidth; 36109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(midOffset, mTextView.getOffsetForPosition(x, y)); 36116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 36126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3613a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineLtr() throws Throwable { 3615023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "aaa\n"; 36166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 36179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 36199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 36209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 36219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 36229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 36239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3626a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 36326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 36336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 36349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 36356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 36366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36374b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3638023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 36396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 36419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 36426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 364391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final float halfCharWidth = (float) Math.ceil(mTextView.getPaint().measureText("a") / 2f); 364491f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 364591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingLeft = mTextView.getTotalPaddingLeft(); 364691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 36476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 36486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 364991f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = lineBounds.height() / 2f + paddingTop; 36509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 36516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 36539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 36579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 365891f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f + paddingTop; 36596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 36616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 36629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 36636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 366591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getLayout().getLineWidth(1) + paddingLeft - halfCharWidth; 36669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 36699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 367391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getLayout().getLineWidth(1) / 2f + paddingLeft - halfCharWidth; 36746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 36759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 36766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 36776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3678a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineRtl() throws Throwable { 3680023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "\u0635\u0635\u0635\n"; 36816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 36829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 36849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 36859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 36869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 36879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 36889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3691a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final LayoutParams layoutParams = new LayoutParams( 36979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.MATCH_PARENT, 36989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.WRAP_CONTENT); 36999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 37006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 37016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37024b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3703023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 37046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 37069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 37076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 370891f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final float halfCharWidth = (float) Math.ceil( 370991f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir mTextView.getPaint().measureText("\u0635") / 2f); 371091f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 371191f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingRight = mTextView.getTotalPaddingRight(); 371291f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 37136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 37149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float x = mTextView.getWidth() - 1f; 371591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = lineBounds.height() / 2f + paddingTop; 37169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 37176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 37196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 37209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 37239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 372491f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f + paddingTop; 37256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 37279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 37289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 37296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 37316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 37329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 373491f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir // left edge of text at second line 373591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getWidth() - (mTextView.getLayout().getLineWidth(1) + paddingRight 373691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir - halfCharWidth); 37379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 374091f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getWidth() - (mTextView.getLayout().getLineWidth(1) / 2f + paddingRight 374191f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir - halfCharWidth); 37426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 37439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 37446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3747a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsFalseByDefault() { 3749a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 37516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 37526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3755a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsTrueIfSetTextIsSelectableCalledWithTrue() { 3757a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 37596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 37606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 37616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3764a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testSetIsTextSelectable() { 3766a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 37696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusable()); 37706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusableInTouchMode()); 37716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isClickable()); 37726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isLongClickable()); 37736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 37756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 37776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusable()); 37786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusableInTouchMode()); 37796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isClickable()); 37806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isLongClickable()); 37816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(textView.getMovementMethod()); 37826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 3783f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3784a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37854b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessTransformationMethod() throws Throwable { 3786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the password attribute in xml 3787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_password); 3788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the singleLine attribute in xml 3793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_singleLine); 3794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(SingleLineTransformationMethod.getInstance(), 3796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false, 3799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Capitalize.NONE); 3800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final TransformationMethod method = PasswordTransformationMethod.getInstance(); 3801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change transformation method by function 38029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 38036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 38046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTransformationMethod(method); 38056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTransformedText = method.getTransformation(mTextView.getText(), mTextView); 3806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 38076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 3808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3813b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, "H E 2*L O"); 38149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.append(" ")); 3815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3817354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // It will get transformed after a while 3818354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're waiting for transformation to "******" 3819354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(TIMEOUT, () -> mTransformedText.toString() 3820354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .equals("\u2022\u2022\u2022\u2022\u2022\u2022")); 3821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set null 38239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTransformationMethod(null)); 3824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTransformationMethod()); 3826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3829a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testCompound() { 3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int padding = 3; 3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Drawable[] drawables = mTextView.getCompoundDrawables(); 3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[0]); 3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[1]); 3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[2]); 3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test setCompoundDrawablePadding and getCompoundDrawablePadding 3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablePadding(padding); 3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(padding, mTextView.getCompoundDrawablePadding()); 3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using resid, 0 represents null 3844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass, 3845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su R.drawable.failed, 0); 3846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3849a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.start), 3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[0]).getBitmap()); 3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3852a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.pass), 3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[1]).getBitmap()); 3854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3855a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.failed), 3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[2]).getBitmap()); 3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3860a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.blue); 3861a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3862a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using drawables directly 3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null); 3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(), 3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(), 3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(), 3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set bounds to drawables and set them again. 3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 1, 2); 3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 3, 4); 3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 5, 6); 3890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // usinf drawables 3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, top, right, null); 3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(), 3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(), 3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(), 3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 39136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir @UiThreadTest 3914a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetCompoundDrawablesRelative() { 39166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare textview 39176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 39186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare drawables 3920a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable start = TestUtils.getDrawable(mActivity, R.drawable.blue); 3921a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable end = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3922a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3923a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.black); 39246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(start); 39256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(end); 39266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(top); 39276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(bottom); 39286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir Drawable[] drawables = mTextView.getCompoundDrawablesRelative(); 39306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 39336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 39346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 39356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 39366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 39386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 39496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(null, null, null, null); 39606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 39656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 39666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 39676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 39686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 39696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3970a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSingleLine() throws Throwable { 39729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 39739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 39749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 39759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu setSpannableText(mTextView, "This is a really long sentence" 3976013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu + " which can not be placed in one line on the screen."); 3977013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3978013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu // Narrow layout assures that the text will get wrapped. 39796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout innerLayout = new FrameLayout(mActivity); 3980013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 39819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu innerLayout.addView(mTextView); 3982013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 3983013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 3984013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu layout.addView(innerLayout); 3985013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 39869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 39876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(layout); 39889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 3989013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu }); 3990013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mInstrumentation.waitForIdleSync(); 3991fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3992fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 39939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 3994da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 3995da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineWidth = 0; 3996da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineHeight = 0; 3997da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 39989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 39999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineWidth = mTextView.getLayout().getWidth(); 40009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineHeight = mTextView.getLayout().getHeight(); 4001da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 40039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setSingleLine(false)); 4004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 40059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(null, mTextView.getTransformationMethod()); 4006da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 40079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 40089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getHeight() > singleLineHeight); 40099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getWidth() < singleLineWidth); 4010da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // same behaviours as setSingLine(true) 40139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(mTextView::setSingleLine); 4014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 40169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 4017da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 40189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 40199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineHeight, mTextView.getLayout().getHeight()); 40209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineWidth, mTextView.getLayout().getWidth()); 4021da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4025a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 402698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMaxLines() { 4027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 40286031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) (mTextView.getPaint().measureText(LONG_TEXT) / 4)); 4029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT); 4030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int maxLines = 2; 4032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > maxLines); 4033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxLines(maxLines); 4035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestLayout(); 4036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 403798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2, mTextView.getMaxLines()); 403898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 4039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight()); 4040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4042636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4043a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4044636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_frequencyNone() { 4045636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] BREAK_STRATEGIES = { 4046636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY, 4047636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_BALANCED }; 4048636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4049636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4050636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4051636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int breakStrategy : BREAK_STRATEGIES) { 4052636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4053636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 40546031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 40556031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4056636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4057636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4058636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(breakStrategy); 4059636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4060636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 4061636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4062636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4063636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4064636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4065636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4066636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4067636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4068636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4069636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any break strategy, hyphenation should not happen if 4070636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // HYPHENATION_FREQUENCY_NONE is specified. 4071636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4072636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4073636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4074636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4075636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4076636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4077636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4078636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4079a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4080636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_breakStrategySimple() { 4081636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] HYPHENATION_FREQUENCIES = { 4082636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, 4083636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NONE }; 4084636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4085636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4086636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4087636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) { 4088636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4089636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 40906031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 40916031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4092636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4093636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4094636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 4095636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4096636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(hyphenationFrequency); 4097636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4098636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4099636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4100636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4101636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4102636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4103636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4104636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4105636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any hyphenation frequency, hyphenation should not happen if 4106636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // BREAK_STRATEGY_SIMPLE is specified. 4107636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4108636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4109636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4110636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4111636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4112636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4113636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4114fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4115a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4116fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxLinesException() { 411772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 411872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 4119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() >> 3); 412072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setMaxLines(-1); 4121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4122fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4123a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41244b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMinLines() throws Throwable { 4125fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4128fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4129fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines - 1); 4130fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 413198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines - 1, mTextView.getMinLines()); 413298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines + 1); 4135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 413698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines + 1, mTextView.getMinLines()); 413798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4138fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4140a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41414b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLines() throws Throwable { 4142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multiple lines 4144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines - 1); 4148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines + 1); 4151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4155a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4156fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLinesException() { 415772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 415872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 415972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setWidth(mTextView.getWidth() >> 3); 416072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setLines(-1); 4161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4164a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingTop() { 4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingTop()); 4169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4171a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 4173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop()); 4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4177fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 4179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingTop() > 0); 4181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4184a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingBottom() { 4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingBottom()); 4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4191a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 4194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom()); 4195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 4199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingBottom() > 0); 4201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4203a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 42044b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingTop() throws Throwable { 4205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingTop()); 4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4210a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 42129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 42136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, top, null, null); 42146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 42156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop()); 4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getHeight() 4223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineTop(mTextView.getLineCount()); 4225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingTop()); 4226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4228a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 42294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingBottom() throws Throwable { 4230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingBottom()); 4233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4235a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 42379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 42386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, null, null, bottom); 42396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 42406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER_VERTICAL); 4241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom()); 4244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = ((mTextView.getHeight() 4248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingTop() 4250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1) 4251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + mTextView.getExtendedPaddingBottom(); 4252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingBottom()); 4253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4256a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingLeft() { 4258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingLeft()); 4261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4263a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.red); 4264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 10, 100); 4265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, null, null, null); 4266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 4267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4275a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingRight() { 4277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingRight()); 4280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4282a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.red); 4283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 10, 100); 4284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, right, null); 4285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_HORIZONTAL); 4286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 42939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4294a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetUrls() { 4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = mTextView.getUrls(); 4299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, spans.length); 4300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String url = "http://www.google.com"; 4302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String email = "name@gmail.com"; 4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = url + " mailto:" + email; 4304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString spannable = new SpannableString(string); 4305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(url), 0, url.length(), 0); 4306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 4309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(email), 0, email.length(), 0); 4312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(email, spans[1].getURL()); 4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test the situation that param what is not a URLSpan 4320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new Object(), 0, 9, 0); 4321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4327a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetPadding() { 4329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(0, 1, 2, 4); 4332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getPaddingLeft()); 4333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getPaddingTop()); 4334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getPaddingRight()); 4335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getPaddingBottom()); 4336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(10, 20, 30, 40); 4338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(10, mTextView.getPaddingLeft()); 4339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20, mTextView.getPaddingTop()); 4340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(30, mTextView.getPaddingRight()); 4341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(40, mTextView.getPaddingBottom()); 4342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4345a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4346fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testDeprecatedSetTextAppearance() { 4347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All); 4350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 4353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 4355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors); 4360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors); 4368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(17f, mTextView.getTextSize(), 0.01f); 4369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style); 4372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(null, mTextView.getTypeface()); 4373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4376a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4377fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testSetTextAppearance() { 4378fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4379fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4380fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_All); 4381fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4382fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4383fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(20f, mTextView.getTextSize(), 0.01f); 4384fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4385fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.red), 4386fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4387fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4388fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 43896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 43906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4391fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4392fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Colors); 4393fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4394fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4395fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4396fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4397fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4398fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 43996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.red), 44006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4401fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4402fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_NotColors); 4403fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(17f, mTextView.getTextSize(), 0.01f); 4404fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4405fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4406fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Style); 4407fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(null, mTextView.getTypeface()); 4408fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4409fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 44109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4411a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4412fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testAccessCompoundDrawableTint() { 4413fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4414fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4415fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai ColorStateList colors = ColorStateList.valueOf(Color.RED); 4416fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintList(colors); 4417fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR); 4418fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertSame(colors, mTextView.getCompoundDrawableTintList()); 4419fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4420f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4421f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette // Ensure the tint is preserved across drawable changes. 4422f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawablesRelative(null, null, null, null); 4423f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4424f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4425f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4426f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(null, null, null, null); 4427f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4428f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4429f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4430f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr1 = new ColorDrawable(Color.RED); 4431f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr2 = new ColorDrawable(Color.GREEN); 4432f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr3 = new ColorDrawable(Color.BLUE); 4433f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr4 = new ColorDrawable(Color.YELLOW); 4434f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4); 4435f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4436f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4437fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4438fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4439a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44404b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetHorizontallyScrolling() throws Throwable { 4441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the text view has more than one line 4442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 1); 4444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(true); 4447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 4448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(false); 4450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4453a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeHorizontalScrollRange() throws Throwable { 44559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 44569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4457fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 44589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 44599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 44609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 44639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 44659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set the layout 44689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 44699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getWidth(), 44709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4473a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeVerticalScrollRange() throws Throwable { 44759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 44769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 4478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 44799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 44809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollRange()); 4481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 44829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 44839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getHeight(), ((MockTextView) mTextView).computeVerticalScrollRange()); 4485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the layout 44879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 44889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getHeight(), 44899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeVerticalScrollRange()); 4490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4492a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 44939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDrawableStateChanged() throws Throwable { 44949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 44959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 44969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 44979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.refreshDrawableState(); 44989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).drawableStateChanged(); 4499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4502a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultEditable() { 45049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 4505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultEditable() does nothing, and always return false. 45079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView) mTextView).getDefaultEditable()); 4508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4511a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultMovementMethod() { 4513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultMovementMethod() does nothing, and always return null. 4516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getDefaultMovementMethod()); 4517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4520a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetFrame() { 4522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a new size to this view 4525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(0, 0, 320, 480)); 4526b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getLeft()); 4527b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getTop()); 4528b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(320, textView.getRight()); 4529b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(480, textView.getBottom()); 4530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a same size to this view 4532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.setFrame(0, 0, 320, 480)); 4533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //negative input 4535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(-1, -1, -1, -1)); 4536b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getLeft()); 4537b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getTop()); 4538b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getRight()); 4539b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getBottom()); 4540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4542a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 45434b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testMarquee() throws Throwable { 4544354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Both are pointing to the same object. This works around current limitation in CTS 4545354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // coverage report tool for properly reporting coverage of base class method calls. 45469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 45479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mSecondTextView = new MockTextView(mActivity); 4548354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 45499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = mSecondTextView; 45509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(LONG_TEXT); 45519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 45529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setEllipsize(TruncateAt.MARQUEE); 45539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLayoutParams(new LayoutParams(100, 100)); 45549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 45559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4556bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4557bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 45589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView); 4559bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the fading to be shown 45619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setHorizontalFadingEdgeEnabled(true); 4562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 4564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu TestSelectedRunnable runnable = new TestSelectedRunnable(mTextView) { 4567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 45689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(-1); 4569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to start 4570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 45719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(true); 4572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 4573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 45759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // wait for the marquee to run 4578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // fading is shown on both sides if the marquee runs for a while 45799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 45809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f 45819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu && ((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45830f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir // wait for left marquee to fully apply 45849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 45859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.99f); 4586354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 4587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected1()); 4588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected2()); 45899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(-1, mTextView.getMarqueeRepeatLimit()); 4590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu runnable = new TestSelectedRunnable(mTextView) { 4592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 45939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(0); 4594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 4595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 45969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(false); 4597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 45989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setGravity(Gravity.LEFT); 4599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 4601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 46029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected1()); 4605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected2()); 46069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 46079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 46089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getMarqueeRepeatLimit()); 4609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.RIGHT)); 4611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 46129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f); 46139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getRightFadingEdgeStrength(), 0.01f); 4614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.CENTER_HORIZONTAL)); 4616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no left fading (Is it correct?) 46189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 46199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4623a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 46246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetMarqueeRepeatLimit() { 46256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final TextView textView = new TextView(mActivity); 46266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 46276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setMarqueeRepeatLimit(10); 46286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(10, textView.getMarqueeRepeatLimit()); 46296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 46306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 46319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4632a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessInputExtras() throws XmlPullParserException, IOException { 46349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 46359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 46369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT); 4637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // do not create the extras 46399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getInputExtras(false)); 4640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // create if it does not exist 46429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Bundle inputExtras = mTextView.getInputExtras(true); 4643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(inputExtras); 4644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(inputExtras.isEmpty()); 4645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4646fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it is created already 46479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNotNull(mTextView.getInputExtras(false)); 4648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 46509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputExtras(R.xml.input_extras); 4651fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 4652fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 4653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4657a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessContentType() { 46599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 46609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 46619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 46629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 46689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateTimeKeyListener); 4669fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4671fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 46749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateKeyListener); 4675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4677fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4678fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 46799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 46809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TimeKeyListener); 4681fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_NUMBER 4683fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4684fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4685fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4686fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 46879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 468873eaebf6dc49e5db83438be84bce12579fe94c94Roozbeh Pournader assertSame(mTextView.getKeyListener(), 46894e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader DigitsKeyListener.getInstance(null, true, true)); 4690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_PHONE); 46929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 46939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DialerKeyListener); 4694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 46959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 46989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 46999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE)); 4700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 47029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4706fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4707fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 47089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 47099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.CHARACTERS)); 47119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 4712fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4715fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 47179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.WORDS)); 47199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4722fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4723fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 47259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.SENTENCES)); 4727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_NULL); 47299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_NULL, mTextView.getInputType()); 47309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TextKeyListener); 4731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4734a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessRawContentType() { 47369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 47379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 47389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 47399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 47459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 47529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 47589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 47599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_NUMBER 4763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 47679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 47689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_PHONE); 47729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 47739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 47809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 47819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 47849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 47909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 47919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 47979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 47989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 47999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 4802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 48049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 48059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 48069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_NULL); 48099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 48109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 4811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4814a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 481572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testVerifyDrawable() { 48169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 481772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4818a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 48199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView ) mTextView).verifyDrawable(d)); 482072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, null); 48229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView ) mTextView).verifyDrawable(d)); 482372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 482472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4825a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 482672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessPrivateImeOptions() { 482772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 482872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 482972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 483072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3"); 483172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions()); 483272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 483372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions(null); 483472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 483572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 483672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4837a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 483872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetOnEditorActionListener() { 483972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 484072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 484198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView.OnEditorActionListener mockOnEditorActionListener = 484298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mock(TextView.OnEditorActionListener.class); 484398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 484472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 484598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setOnEditorActionListener(mockOnEditorActionListener); 484698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 484772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 484872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE); 484998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockOnEditorActionListener, times(1)).onEditorAction(mTextView, 485098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov EditorInfo.IME_ACTION_DONE, null); 485172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 485272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4853a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 485472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeOptions() { 485572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 485672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 485772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 485872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_GO); 485972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions()); 486072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 486172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE); 486272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions()); 486372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 486472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_NULL); 486572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 486672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 486772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 4868a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 486972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeActionLabel() { 487072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 487172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getImeActionLabel()); 487272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getImeActionId()); 487372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 487472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeActionLabel("pinyin", 1); 487572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("pinyin", mTextView.getImeActionLabel().toString()); 487672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(1, mTextView.getImeActionId()); 487772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 487872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 48799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4880a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4881d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa public void testAccessImeHintLocales() { 4882d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final TextView textView = new TextView(mActivity); 4883d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setText("", BufferType.EDITABLE); 4884d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setKeyListener(null); 4885d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setRawInputType(InputType.TYPE_CLASS_TEXT); 4886d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(textView.getImeHintLocales()); 4887d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4888d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4889d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4890d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(editorInfo.hintLocales); 4891d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4892d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4893d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US"); 4894d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setImeHintLocales(localeList); 4895d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, textView.getImeHintLocales()); 4896d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 4897d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 4898d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 4899d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, editorInfo.hintLocales); 4900d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4901d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 4902d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 4903c873101a88e7ba584065de5e912508237378ca99Victoria Lease @UiThreadTest 4904a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 49054e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesChangesInputType() { 49064e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 49074e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 49084e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49094e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(InputType.TYPE_CLASS_NUMBER); 49104e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(InputType.TYPE_CLASS_NUMBER, textView.getInputType()); 49114e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49124e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final LocaleList localeList = LocaleList.forLanguageTags("fa-IR"); 49134e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(localeList); 49144e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL; 49154e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting IME hint locales to Persian must change the input type to a full text IME, 49164e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // since the typical number input IME may not have localized digits. 49174e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 49184e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49194e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to datetime should keep the full text IME, since the IME hint 49204e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // is still set to Persian, which needs advanced input. 49214e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int dateType = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE; 49224e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(dateType); 49234e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 49244e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49254e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to number password should keep the full text IME, since the IME 49264e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // hint is still set to Persian, which needs advanced input. But it also needs to set the 49274e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // text password flag. 49284e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int numberPasswordType = InputType.TYPE_CLASS_NUMBER 49294e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_NUMBER_VARIATION_PASSWORD; 49304e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textPasswordType = InputType.TYPE_CLASS_TEXT 49314e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_PASSWORD; 49324e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(numberPasswordType); 49334e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textPasswordType, textView.getInputType()); 49344e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49354e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting the IME hint locales to null should reset the type to number password, since we 49364e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // no longer need internationalized input. 49374e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(null); 49384e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(numberPasswordType, textView.getInputType()); 49394e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 49404e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49414e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 49424e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 49434e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesDoesntLoseInputType() { 49444e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 49454e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 49464e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int inputType = InputType.TYPE_CLASS_TEXT 49474e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT 49484e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS 49494e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_MULTI_LINE 49504e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 49514e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(inputType); 49524e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(new LocaleList(Locale.US)); 49534e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(inputType, textView.getInputType()); 49544e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 49554e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 49564e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 49574e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 495872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetExtractedText() { 495972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 496072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 496172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.getText().toString()); 496272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 496372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText et = new ExtractedText(); 4964ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4965ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text and selection. 496672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach et.text = "test"; 4967ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 0; 4968ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 2; 496972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 497072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setExtractedText(et); 497172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("test", mTextView.getText().toString()); 4972ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(0, mTextView.getSelectionStart()); 4973ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionEnd()); 4974ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4975ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Use partialStartOffset and partialEndOffset 4976ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 2; 4977ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4978ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = "x"; 4979ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 2; 4980ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 3; 4981ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4982ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4983ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4984ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionStart()); 4985ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, mTextView.getSelectionEnd()); 4986ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4987ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text with spans. 4988ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final SpannableString ss = new SpannableString("ex"); 4989ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new UnderlineSpan(), 0, 2, 0); 4990ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0); 4991ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4992ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = ss; 4993ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 1; 4994ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 4995ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 4996ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 4997ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 4998ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final Editable editable = mTextView.getEditableText(); 4999ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans( 5000ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), UnderlineSpan.class); 5001ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, underlineSpans.length); 5002ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, editable.getSpanStart(underlineSpans[0])); 5003ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(underlineSpans[0])); 5004ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5005ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final URLSpan[] urlSpans = mTextView.getEditableText().getSpans( 5006ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), URLSpan.class); 5007ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, urlSpans.length); 5008ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, editable.getSpanStart(urlSpans[0])); 5009ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(urlSpans[0])); 5010ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("ctstest://TextView/test", urlSpans[0].getURL()); 501172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 501272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5013a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 501472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testMoveCursorToVisibleOffset() throws Throwable { 501572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 501672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 501772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // not a spannable text 50184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 501972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 502072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 502172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a selection range 502272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach final String spannableText = "text"; 50236b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 50249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 502572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50264b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 5027a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov () -> mTextView.setText(spannableText, BufferType.SPANNABLE)); 502872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 502972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length()); 503072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 503172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getSelectionStart()); 503272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(spannableText.length(), mTextView.getSelectionEnd()); 50334b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 503472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 503572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 503672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a spannable without range 50374b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 50386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 50396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(spannableText, BufferType.SPANNABLE); 504072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 504172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 504272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50434b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertTrue(mTextView.moveCursorToVisibleOffset())); 504472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 504572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 504672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5047a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5048afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void testIsInputMethodTarget() throws Throwable { 504972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 505072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isInputMethodTarget()); 505172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 505272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isFocused()); 50534b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 50546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 50556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 50566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu }); 5057afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mInstrumentation.waitForIdleSync(); 5058afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu assertTrue(mTextView.isFocused()); 505904d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu 5060b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mTextView::isInputMethodTarget); 506172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 506272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5064a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 50656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testBeginEndBatchEditAreNotCalledForNonEditableText() { 5066b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir final TextView mockTextView = spy(new TextView(mActivity)); 5067b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 5068b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // TextView should not call onBeginBatchEdit or onEndBatchEdit during initialization 5069b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5070b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 507272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.beginBatchEdit(); 5074b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5075b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5076b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.endBatchEdit(); 5079b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5080b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5081b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 50826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 50836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5084a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 50854b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testBeginEndBatchEditCallbacksAreCalledForEditableText() throws Throwable { 50869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new TextView(mActivity))); 50879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 50886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5089a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final FrameLayout layout = new FrameLayout(mActivity); 50906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 50916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 50926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 50939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 50946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 50956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 50976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 50986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 50999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 51009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 51019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 51029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.requestFocus(); 51036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir }); 51046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 51056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 51069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 51079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.hasFocus()); 51089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 51099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 51106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 51119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.beginBatchEdit(); 51126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 51139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onBeginBatchEdit(); 51149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 5115b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 51169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 51179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.endBatchEdit(); 51189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 51199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onEndBatchEdit(); 512072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 512172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 512272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5123a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 512472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBringPointIntoView() throws Throwable { 512572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 512672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(1)); 512772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 512872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.layout(0, 0, 100, 100); 512972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(2)); 513072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 513172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5132a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 513372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testCancelLongPress() { 513472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 51359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 513672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.cancelLongPress(); 513772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 513872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 513972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5140a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 514172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testClearComposingText() { 514272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 514372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText("Hello world!", BufferType.SPANNABLE); 514472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Spannable text = (Spannable) mTextView.getText(); 514572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 514672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 514772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 514872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 514972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach BaseInputConnection.setComposingSpans((Spannable) mTextView.getText()); 515072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 515172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 515272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 515372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.clearComposingText(); 515472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 515572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 515672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 515772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 51589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5159a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 516072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testComputeVerticalScrollExtent() { 51619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 51629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 516372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5164a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 51659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, d); 516672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 51679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 516872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 516972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 517072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5171a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 517272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testDidTouchFocusSelect() { 5173c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne mTextView = new EditText(mActivity); 517472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.didTouchFocusSelect()); 517572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 517672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setFocusable(true); 517772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.requestFocus(); 517872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.didTouchFocusSelect()); 517972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 518072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5181a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 51824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSelectAllJustAfterTap() throws Throwable { 51830ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Prepare an EditText with focus. 51849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 51855799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky // Make a dummy focusable so that initial focus doesn't go to our test textview 51865799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky LinearLayout top = new LinearLayout(mActivity); 51875799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky TextView dummy = new TextView(mActivity); 51885799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky dummy.setFocusableInTouchMode(true); 51895799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 51906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 51915799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(mTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 51925799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky mActivity.setContentView(top); 51930ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(mTextView.didTouchFocusSelect()); 51956beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 51966beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 51976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.didTouchFocusSelect()); 51980ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 51996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello, World.", BufferType.SPANNABLE); 52000ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 52010ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 52020ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 52030ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Tap the view to show InsertPointController. 52049404cdc3d439d5a2d1b805934c53a8ba6dc68fa8Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 520583a70cb57c839148a4feff786cdbb3803828d484Bobby Wang // bad workaround for waiting onStartInputView of LeanbackIme.apk done 520683a70cb57c839148a4feff786cdbb3803828d484Bobby Wang try { 520783a70cb57c839148a4feff786cdbb3803828d484Bobby Wang Thread.sleep(1000); 520883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } catch (InterruptedException e) { 520983a70cb57c839148a4feff786cdbb3803828d484Bobby Wang e.printStackTrace(); 521083a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } 52110ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 52120ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Execute SelectAll context menu. 52139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.onTextContextMenuItem(android.R.id.selectAll)); 52140ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 52150ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 52160ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // The selection must be whole of the text contents. 52170ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(0, mTextView.getSelectionStart()); 521883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang assertEquals("Hello, World.", mTextView.getText().toString()); 52190ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(mTextView.length(), mTextView.getSelectionEnd()); 52200ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 52210ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 52229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5223a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 522472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testExtractText() { 522572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 522672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 522772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedTextRequest request = new ExtractedTextRequest(); 522872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText outText = new ExtractedText(); 522972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 523072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.token = 0; 523172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.flags = 10; 523272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxLines = 2; 523372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxChars = 20; 523472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 523572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 523672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 523772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 523872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 523972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 524072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach outText.text.toString()); 5241c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi 5242c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi // Tests for invalid arguments. 5243c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(request, null)); 5244c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, outText)); 5245c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, null)); 524672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 524772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 524894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5249a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 525094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testTextDirectionDefault() { 5251c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 52522a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 525394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 525494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 525594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5256a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 525794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testSetGetTextDirection() { 5258c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 525994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52612a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection()); 526294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52642a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection()); 526594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 52672a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 526894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 526994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 52702a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection()); 527194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 527294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 52732a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection()); 527494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 527594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 52762a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection()); 527702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 527802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 527902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection()); 528002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 528102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 528202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection()); 528394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 528494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 528594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5286a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 528794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtr() { 5288c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 528994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 529094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 52912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 529294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 52942a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 529594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 52972a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 529894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 529994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53002a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 530194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 530294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53032a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 530494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 530594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53062a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 530794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 530894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53092a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 531002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 531102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 531202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 531302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 531402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 531502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 531694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 531794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 531894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5319a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 532094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtrWithInheritance() { 5321c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 532294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 532394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5324c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 532594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 532694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 532794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 532894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 533094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 53322a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 533394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53352a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 533694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 533794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53382a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 533994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 534094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53412a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 534294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 534394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53442a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 534502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 534702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 534802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 534902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 535002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 535194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 535294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 535394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5354a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 535594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtl() { 5356c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 535794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 535894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 53592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 536094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 536394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 53652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 536694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 536794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 53682a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 536994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 537094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 53712a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 537294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 537394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 53742a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 537594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 537694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 53772a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 537802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 537902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 538002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 538102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 538202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 538302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 538494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 538594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 538694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5387a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 538894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtlWithInheritance() { 5389c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 539094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 539194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5392c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 539394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 539494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 539594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 539694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 53972a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 539894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 539994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 54002a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 540194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 540294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 54032a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 540494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 540594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 54062a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 540794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 540894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 54092a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 541094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 541194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 54122a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 541394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 541402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 541502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 541602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 541702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 541802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 541902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 542094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio // Force to RTL text direction on the layout 542194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 542294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 542394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 54242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 542594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 542694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 54272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 542894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 542994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 54302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 543194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 543294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 54332a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 543494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 543594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 54362a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 543794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 543894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 54392a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 544002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 544102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 544202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 544302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 544402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 544502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 544694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 544794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 544894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5449a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 545094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testResetTextDirection() { 5451c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5452c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 545394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 545494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 545594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 54562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 545794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5458f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // No reset when we remove the view 545994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.removeView(tv); 5460f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 5461f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio 5462f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // Reset is done when we add the view 5463f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio ll.addView(tv); 54642a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 546594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 546694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 546702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5468a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 546902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongLtr() { 547002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 547102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 547202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 547302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 547402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 547502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 547602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 547702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 547802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 547902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 548002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 548102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 548202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 548302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 548402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 548502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 548602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 548702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 548802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 548902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 549002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 549102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 549202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 549302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 549402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 549502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 549602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 549702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 549802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 549902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 550002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 550102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 550202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is LTR. 550302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 550402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 550502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 550602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 550702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 550802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 550902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 551002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 551102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 551202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 551302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 551402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 551502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 551602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 551702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 551802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5519a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 552002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongRtl() { 552102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 552202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 552302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 552402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 552502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 552602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 552702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 552802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 552902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 553002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 553102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 553202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 553302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 553402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 553502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 553602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 553702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 553802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 553902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 554002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 554102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 554202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 554302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 554402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 554502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 554602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 554702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 554802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 554902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 555002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 555102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 555202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 555302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is RTL. 555402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 555502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 555602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 555702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 555802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 555902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 556002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 556102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 556202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 556302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 556402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 556502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 556602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 556702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 556802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 55699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5570a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5571c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader public void testTextLocales() { 5572c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader TextView tv = new TextView(mActivity); 5573c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.getDefault(), tv.getTextLocale()); 5574c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.getDefault(), tv.getTextLocales()); 5575c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5576c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(Locale.CHINESE); 5577c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.CHINESE, tv.getTextLocale()); 5578c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales()); 5579c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5580c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(LocaleList.forLanguageTags("en,ja")); 5581c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale()); 5582c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales()); 5583c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5584c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5585c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(null); 5586c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to null should throw"); 5587c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5588c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5589c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5590c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5591c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5592c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(null); 5593c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locales to null should throw"); 5594c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5595c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5596c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5597c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5598c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5599c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(new LocaleList()); 5600c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to an empty list should throw"); 5601c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5602c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5603c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5604c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5605c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 56069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5607a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5608a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_Localization() { 5609a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String testString = "abcdefghijklmnopqrstuvwxyz i\u0307\u0301 άέήίΐόύΰώάυ ή"; 5610a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5611a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // Capital "i" in Turkish and Azerbaijani is different from English, Lithuanian has special 5612a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // rules for uppercasing dotted i with accents, and Greek has complex capitalization rules. 5613a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale[] testLocales = { 5614a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("az", "AZ"), // Azerbaijani 5615a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("tr", "TR"), // Turkish 5616a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("lt", "LT"), // Lithuanian 5617a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("el", "GR"), // Greek 5618a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader Locale.US, 5619b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka }; 5620b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5621a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5622b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setAllCaps(true); 5623b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka for (Locale locale: testLocales) { 5624b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setTextLocale(locale); 5625b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka assertEquals("Locale: " + locale.getDisplayName(), 5626a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader UCharacter.toUpperCase(locale, testString), 5627b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.getTransformationMethod().getTransformation(testString, tv).toString()); 5628b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5629b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5630b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5631dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5632a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5633a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_SpansArePreserved() { 5634a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale greek = new Locale("el", "GR"); 5635a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String lowerString = "ι\u0301ριδα"; // ίριδα with first letter decomposed 5636a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String upperString = "ΙΡΙΔΑ"; // uppercased 5637a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // expected lowercase to uppercase index map 5638a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int[] indexMap = {0, 1, 1, 2, 3, 4, 5}; 5639a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int flags = Spanned.SPAN_INCLUSIVE_INCLUSIVE; 5640a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5641a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5642a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setTextLocale(greek); 5643a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setAllCaps(true); 5644a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5645a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spannable source = new SpannableString(lowerString); 5646a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 1, flags); 5647a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 2, flags); 5648a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 3, flags); 5649a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 3, 4, flags); 5650a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 4, 5, flags); 5651a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 5, 6, flags); 5652a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 2, flags); 5653a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 3, flags); 5654a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 4, flags); 5655a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 6, flags); 5656a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] sourceSpans = source.getSpans(0, source.length(), Object.class); 5657a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5658a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final CharSequence transformed = 5659a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.getTransformationMethod().getTransformation(source, tv); 5660a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertTrue(transformed instanceof Spanned); 5661a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spanned result = (Spanned) transformed; 5662a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5663a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(upperString, transformed.toString()); 5664a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] resultSpans = result.getSpans(0, result.length(), Object.class); 5665a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(sourceSpans.length, resultSpans.length); 5666a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader for (int i = 0; i < sourceSpans.length; i++) { 5667a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertSame(sourceSpans[i], resultSpans[i]); 5668a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object span = sourceSpans[i]; 5669a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanStart(span)], result.getSpanStart(span)); 5670a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanEnd(span)], result.getSpanEnd(span)); 5671a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(source.getSpanFlags(span), result.getSpanFlags(span)); 5672a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5673a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5674a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5675a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @UiThreadTest 5676a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @Test 5677dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testTextAlignmentDefault() { 5678a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 56797fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5680dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // resolved default text alignment is GRAVITY 56817fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5682dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5683dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5684dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5685a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5686dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testSetGetTextAlignment() { 5687a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5688dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5689dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 56907fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5691dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5692dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 56937fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment()); 5694dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5695dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 56967fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment()); 5697dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5698dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 56997fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment()); 5700dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5701dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57027fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment()); 5703dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5704dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57057fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment()); 5706dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5707dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5708dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5709a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5710dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignment() { 5711a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5712dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 57137fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5714dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5715757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test center alignment first so that we dont hit the default case 5716dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 57177fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5718dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5719757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test the default case too 5720757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5721757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5722757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio 5723dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 57247fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5725dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5726dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 57277fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5728dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5729dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57307fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5731dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5732dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57337fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5734dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5735dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5736dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5737a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5738dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignmentWithInheritance() { 5739a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = new LinearLayout(mActivity); 5740dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5741dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5742a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5743dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.addView(tv); 5744dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5745dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // check defaults 57467fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5747dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5748dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5749dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // set inherit and check that child is following parent 5750dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 57517fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment()); 5752dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5753dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 57547fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5755dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5756dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 57577fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5758dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5759dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 57607fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5761dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5762dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57637fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5764dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5765dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5767dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5768dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // now get rid of the inheritance but still change the parent 5769dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5770dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5771dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 57727fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5773dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5774dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 57757fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5776dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5777dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 57787fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5779dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5780dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 57817fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5782dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5783dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 57847fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5785dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5786dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5787dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5788a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5789dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testResetTextAlignment() { 5790a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5791a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 5792dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5793dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 5794dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 57957fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5796dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 57974f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // No reset when we remove the view 5798dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.removeView(tv); 57994f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 58004f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio 58014f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Reset is done when we add the view 58024f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Default text alignment is GRAVITY 58034f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio ll.addView(tv); 58047fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5805dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5806dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5807938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @UiThreadTest 5808a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5809938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testDrawableResolution() { 5810b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5811938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5812a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5813938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5814a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5815938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5816b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5817b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.2: left / right drawable defined in default RTL mode 5818938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5819a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5820938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5821a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 5822938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5823b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5824b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.1: start / end drawable defined in LTR mode 5825938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_1); 5826a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5827938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5828a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5829938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5830b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5831b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.2: start / end drawable defined in RTL mode 5832938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_2); 5833a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5834938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5835a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5836938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5837b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5838b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.1: left / right / start / end drawable defined in LTR mode 5839938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_1); 5840a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5841938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5842a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5843938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5844b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5845b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.2: left / right / start / end drawable defined in RTL mode 5846938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_2); 5847a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5848938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5849a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5850938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5851b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5852b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.1: start / end drawable defined in LTR mode inside a layout 5853b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5854938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_1); 5855a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5856938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5857a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5858938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5859b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5860b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.2: start / end drawable defined in RTL mode inside a layout 5861b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5862938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_2); 5863a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5864938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5865a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5866938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5867b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5868b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout 5869b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5870938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_1); 5871a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5872938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5873a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5874938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5875b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 5876b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout 5877b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 5878938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_2); 5879a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 5880938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5881a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 5882938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 5883b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio } 5884b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 58859776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio @UiThreadTest 5886a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 58879776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio public void testDrawableResolution2() { 58889776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 5889938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 5890a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5891938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 58929776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5893a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(null, null, 5894a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null); 5895a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, R.drawable.icon_yellow, -1, -1); 58969776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5897938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 5898a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 5899938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 59009776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5901a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null, 5902a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null); 5903a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 59049776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5905938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_ltr); 5906a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, -1, -1, -1); 59079776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5908a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_blue), null, 5909a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_red), null); 5910a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, -1, -1); 59119776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 5912a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawablesRelative(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), 5913a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null, null); 5914a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 5915938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 5916938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5917a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5918938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testCompoundAndTotalPadding() { 5919938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Resources res = mActivity.getResources(); 5920938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int drawablePadding = res.getDimensionPixelSize(R.dimen.textview_drawable_padding); 5921938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingLeft = res.getDimensionPixelSize(R.dimen.textview_padding_left); 5922938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingRight = res.getDimensionPixelSize(R.dimen.textview_padding_right); 5923938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingTop = res.getDimensionPixelSize(R.dimen.textview_padding_top); 5924938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingBottom = res.getDimensionPixelSize(R.dimen.textview_padding_bottom); 5925938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int iconSize = TestUtils.dpToPx(mActivity, 32); 5926938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5927938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewLtr = (TextView) mActivity.findViewById( 5928938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_ltr); 5929938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftLtr = paddingLeft + drawablePadding + iconSize; 5930938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightLtr = paddingRight + drawablePadding + iconSize; 5931938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingLeft()); 5932938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingStart()); 5933938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingLeft()); 5934938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingStart()); 5935938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingRight()); 5936938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingEnd()); 5937938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingRight()); 5938938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingEnd()); 5939938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5940938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingTop()); 5941938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5942938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingBottom()); 5943938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 5944938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewRtl = (TextView) mActivity.findViewById( 5945938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_rtl); 5946938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftRtl = paddingLeft + drawablePadding + iconSize; 5947938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightRtl = paddingRight + drawablePadding + iconSize; 5948938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingLeft()); 5949938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingEnd()); 5950938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingLeft()); 5951938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingEnd()); 5952938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingRight()); 5953938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingStart()); 5954938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingRight()); 5955938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingStart()); 5956938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 5957938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingTop()); 5958938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 5959938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingBottom()); 59609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 59619776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 59629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5963a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5964e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetBreakStrategy() { 5965e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 5966e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5967a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final PackageManager pm = mInstrumentation.getTargetContext().getPackageManager(); 59682751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka 5969d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for 59702751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // TextView except for Android Wear. The default value for Android Wear is 59712751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // BREAK_STRATEGY_BALANCED. 59722751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { 59732751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // Android Wear 59742751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 59752751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } else { 59762751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // All other form factor. 59772751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 59782751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } 5979e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5980e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5981e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy()); 5982e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5983e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5984e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 5985e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 5986e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 5987e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 5988d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5989d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi EditText et = new EditText(mActivity); 5990d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5991d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for 5992d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // EditText. 5993d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5994d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5995d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 5996d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 5997d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 5998d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 5999d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy()); 6000d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6001d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 6002d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy()); 6003e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 6004e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 60059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 6006a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6007e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetHyphenationFrequency() { 6008e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 6009e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6010d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 6011e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6012e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 6013e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency()); 6014e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6015e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); 6016e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 6017e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6018e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); 6019e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency()); 6020e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 6021e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6022a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @UiThreadTest 6023a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @Test 6024a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka public void testSetGetJustify() { 6025a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka TextView tv = new TextView(mActivity); 6026a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 6027598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 6028598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_INTER_WORD); 6029598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, tv.getJustificationMode()); 6030598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_NONE); 6031598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 6032a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka } 6033a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 6034a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 60354796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka public void testJustificationByStyle() { 60364796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView defaultTv = findTextView(R.id.textview_justification_default); 60374796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView noneTv = findTextView(R.id.textview_justification_none); 60384796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView interWordTv = findTextView(R.id.textview_justification_inter_word); 60394796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 60404796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, defaultTv.getJustificationMode()); 60414796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, noneTv.getJustificationMode()); 60424796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, interWordTv.getJustificationMode()); 60434796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka } 60444796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 60454796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka @Test 60464b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetAndGetCustomSelectionActionModeCallback() throws Throwable { 604732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final String text = "abcde"; 60489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 60506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 60516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 60526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTextIsSelectable(true); 60536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 60546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 6055e1508b3cc13e50ae674eb4b9af6ee9f663e2b1e3Abodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 605632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 605732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 605832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 605932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 606032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomSelectionActionModeCallback()); 606132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 606298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 606398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 606498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 606598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomSelectionActionModeCallback(mockActionModeCallback); 606698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, 606732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.getCustomSelectionActionModeCallback()); 606832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 60716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 60726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 60736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 60746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 60756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 607632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 607732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 607832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 607998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 608098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 608132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 60846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 608532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 608632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 608732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 608832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was blocked. 608998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, never()).onDestroyActionMode(any(ActionMode.class)); 609032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 609198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov // Reset and reconfigure callback. 609298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockActionModeCallback); 609398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 609498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.TRUE); 609598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomSelectionActionModeCallback()); 609632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 60979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 60986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 60996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 61006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 61016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 61026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 61036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 610432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 610532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 610632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 610732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 610898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 610998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 611032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 61119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 61126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 61136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 611432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 611532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 611632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 611732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was started 611898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onDestroyActionMode(any(ActionMode.class)); 611932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 612032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 61216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 6122a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 612398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testSetAndGetCustomInsertionActionMode() { 612432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi initTextViewForTyping(); 612532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 612632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomInsertionActionModeCallback()); 612732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 612898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 612998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 613098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 613198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomInsertionActionModeCallback(mockActionModeCallback); 613298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomInsertionActionModeCallback()); 613332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // TODO(Bug: 22033189): Tests the set callback is actually used. 613432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 613532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 613689b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @UiThreadTest 613789b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @Test 613889b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky public void testRespectsViewFocusability() { 613989b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky TextView v = (TextView) mActivity.findViewById(R.id.textview_singleLine); 614089b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertFalse(v.isFocusable()); 614189b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky // TextView used to set focusable to true or false verbatim which would break the following. 614289b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky v.setClickable(true); 614389b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertTrue(v.isFocusable()); 614489b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky } 614589b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky 6146a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testTextShadows() throws Throwable { 614898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textViewWithConfiguredShadow = 614998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov (TextView) mActivity.findViewById(R.id.textview_with_shadow); 6150a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, textViewWithConfiguredShadow.getShadowDx(), 0.0f); 6151a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, textViewWithConfiguredShadow.getShadowDy(), 0.0f); 6152a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textViewWithConfiguredShadow.getShadowRadius(), 0.0f); 615398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.GREEN, textViewWithConfiguredShadow.getShadowColor()); 615432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 615598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6156a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDx(), 0.0f); 6157a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDy(), 0.0f); 6158a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowRadius(), 0.0f); 615932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 61609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setShadowLayer(5.0f, 3.0f, 4.0f, Color.RED)); 616198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6162a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textView.getShadowDx(), 0.0f); 6163a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(4.0f, textView.getShadowDy(), 0.0f); 6164a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(5.0f, textView.getShadowRadius(), 0.0f); 616598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.RED, textView.getShadowColor()); 616672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 616772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 6168a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61694b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testFontFeatureSettings() throws Throwable { 6170354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6171354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.isEmpty(textView.getFontFeatureSettings())); 6172354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 61739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("smcp")); 6174354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6175354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("smcp", textView.getFontFeatureSettings()); 6176354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 61779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("frac")); 6178354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6179354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("frac", textView.getFontFeatureSettings()); 6180354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6181354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6182354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private static class SoftInputResultReceiver extends ResultReceiver { 6183354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private boolean mIsDone; 6184354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private int mResultCode; 6185354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6186354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public SoftInputResultReceiver(Handler handler) { 6187354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov super(handler); 6188354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6189354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6190354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov @Override 6191354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov protected void onReceiveResult(int resultCode, Bundle resultData) { 6192354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mResultCode = resultCode; 6193354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = true; 6194354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6195354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6196354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void reset() { 6197354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mIsDone = false; 6198354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6199354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6200354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6201a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 62024b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessShowSoftInputOnFocus() throws Throwable { 6203354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov if (!mActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS)) { 6204354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov return; 6205354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6206354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 620758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare a test Layout 620858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // will add an focusable TextView so that EditText will not get focus at activity start 620958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final TextView textView = new TextView(mActivity); 621058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusable(true); 621158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir textView.setFocusableInTouchMode(true); 621258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // EditText to test 621358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final EditText editText = new EditText(mActivity); 621458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setShowSoftInputOnFocus(true); 621558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusable(true); 621658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir editText.setFocusableInTouchMode(true); 621758b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir // prepare and set the layout 621858b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir final LinearLayout layout = new LinearLayout(mActivity); 621958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.setOrientation(LinearLayout.VERTICAL); 622058b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(textView, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 622158b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 622258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir layout.addView(editText, new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 622358b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir LayoutParams.WRAP_CONTENT)); 622458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 622558b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 622658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 6227354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6228354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 622958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(editText.getShowSoftInputOnFocus()); 6230354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6231354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And emulate click on it 623258b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 6233354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6234354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Verify that input method manager is active and accepting text 6235354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final InputMethodManager imManager = (InputMethodManager) mActivity 6236354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .getSystemService(Context.INPUT_METHOD_SERVICE); 6237b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(imManager::isActive); 6238354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(imManager.isAcceptingText()); 623958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertTrue(imManager.isActive(editText)); 6240354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6241354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Since there is no API to check that soft input is showing, we're going to ask 6242354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // the input method manager to show soft input, passing our custom result receiver. 6243354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're expecting to get UNCHANGED_SHOWN, indicating that the soft input was already 6244354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // showing before showSoftInput was called. 6245354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov SoftInputResultReceiver receiver = new SoftInputResultReceiver(mHandler); 624658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 6247354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 6248354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_UNCHANGED_SHOWN, receiver.mResultCode); 6249354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6250354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 6251a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 6252354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6253354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Reconfigure our edit text to not show soft input on focus 625458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir mActivityRule.runOnUiThread(() -> editText.setShowSoftInputOnFocus(false)); 6255354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 625658b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir assertFalse(editText.getShowSoftInputOnFocus()); 6257354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6258354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Emulate click on it 625958b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, editText); 6260354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6261354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Ask input method manager to show soft input again. This time we're expecting to get 6262354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // SHOWN, indicating that the soft input was not showing before showSoftInput was called. 6263354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov receiver.reset(); 626458b22e7c03035c96247e4705d63d3904bbe45c9eSiyamed Sinir imManager.showSoftInput(editText, 0, receiver); 6265354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(() -> receiver.mIsDone); 6266354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(InputMethodManager.RESULT_SHOWN, receiver.mResultCode); 6267354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6268354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Close soft input 6269a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 6270354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6271354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6272a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 62734b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testIsSuggestionsEnabled() throws Throwable { 627441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 627541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 627641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything without InputType.TYPE_CLASS_TEXT doesn't have suggestions enabled 62774b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_DATETIME)); 627841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 627941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62804b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_PHONE)); 628141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 628241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62834b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_NUMBER)); 628441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 628541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 628641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // From this point our text view has InputType.TYPE_CLASS_TEXT 628741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 628841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything with InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS doesn't have suggestions enabled 62894b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 629041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 629141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 629241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 629341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 62944b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 629541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 629641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | 629741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 629841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 629941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63004b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 630141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 630241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | 630341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 630441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 630541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 630641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Otherwise suggestions are enabled for specific type variations enumerated in the 630741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // documentation of TextView.isSuggestionsEnabled 63084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 630941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 631041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL)); 631141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 631241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 631441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 631541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT)); 631641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 631741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 631941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 632041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE)); 632141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 632241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63234b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 632441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 632541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE)); 632641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 632741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 632941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 633041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT)); 633141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 633241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 633341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // and not on any other type variation 63344b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 633541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 633641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)); 633741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 633841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63394b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 634041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 634141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER)); 634241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 634341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63444b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 634541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 634641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)); 634741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 634841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63494b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 635041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 635141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME)); 635241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 635341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63544b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 635541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 635641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC)); 635741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 635841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 636041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 636141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS)); 636241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 636341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63644b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 636541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 636641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI)); 636741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 636841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63694b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 637041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 637141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 637241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)); 637341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 637441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63754b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 637641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 637741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 637841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS)); 637941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 638041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 63814b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 638241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 638341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD)); 638441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 638541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 638641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6387a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 63884b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessLetterSpacing() throws Throwable { 638941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 6390a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, mTextView.getLetterSpacing(), 0.0f); 639141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 639241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final CharSequence text = mTextView.getText(); 639341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int textLength = text.length(); 639441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 639541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at the default letter spacing 639641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] initialWidths = new float[textLength]; 639741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), initialWidths); 639841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 639941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 1.0f 64004b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 640141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(1.0f)); 6402a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mTextView.getLetterSpacing(), 0.0f); 640341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] singleWidths = new float[textLength]; 640441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), singleWidths); 640541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 640641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 2.0f 64074b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 640841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(2.0f)); 6409a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, mTextView.getLetterSpacing(), 0.0f); 641041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] doubleWidths = new float[textLength]; 641141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), doubleWidths); 641241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 641341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Since letter spacing setter treats the parameter as EM units, and we don't have 641441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // a way to convert EMs into pixels, go over the three arrays of advance widths and 641541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // test that the extra advance width at letter spacing 2.0f is double the extra 641641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // advance width at letter spacing 1.0f. 641741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov for (int i = 0; i < textLength; i++) { 641841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float singleWidthDelta = singleWidths[i] - initialWidths[i]; 641941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float doubleWidthDelta = doubleWidths[i] - initialWidths[i]; 642041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("At index " + i + " initial is " + initialWidths[i] + 642141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov ", single is " + singleWidths[i] + " and double is " + doubleWidths[i], 642241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov singleWidthDelta * 2.0f, doubleWidthDelta, 0.05f); 642341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 642441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 642541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6426a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 64274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testTextIsSelectableFocusAndOnClick() throws Throwable { 6428288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // Prepare a focusable TextView with an onClickListener attached. 6429288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu final View.OnClickListener mockOnClickListener = mock(View.OnClickListener.class); 6430d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu final int safeDoubleTapTimeout = ViewConfiguration.getDoubleTapTimeout() + 1; 64319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 64325799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky // set up a dummy focusable so that initial focus doesn't go to our test textview 64335799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky LinearLayout top = new LinearLayout(mActivity); 64345799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky TextView dummy = new TextView(mActivity); 64355799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky dummy.setFocusableInTouchMode(true); 64365799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 6437288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView = new TextView(mActivity); 643852e5d256861edd0ff4f58da581b8bbd9df1c1d99Siyamed Sinir mTextView.setText("...text 11:11. some more text is in here..."); 6439288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setFocusable(true); 6440288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setOnClickListener(mockOnClickListener); 64415799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(mTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 64425799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky mActivity.setContentView(top); 6443288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu }); 6444288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6445288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6446288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isTextSelectable()); 6447288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocusableInTouchMode()); 6448288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6449288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isInTouchMode()); 6450288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6451288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view triggers onClick() but does not focus the TextView. 64528bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6453d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6454288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6455288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6456288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6457288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6458d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // So does the second tap. 64598bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6460d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6461288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6462288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6463288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6464288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 64659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTextIsSelectable(true)); 6466288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6467288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6468288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isTextSelectable()); 6469288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusableInTouchMode()); 6470288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6471288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6472288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view focuses the TextView but does not trigger onClick(). 6473288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 64748bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6475d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6476288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6477288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6478288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, never()).onClick(mTextView); 6479288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6480d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // The second tap triggers onClick() and keeps the focus. 64818bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6482d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6483288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6484288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6485288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6486288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu } 6487288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 648841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov private void verifyGetOffsetForPosition(final int x, final int y) { 648941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int actual = mTextView.getOffsetForPosition(x, y); 649041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 649141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final Layout layout = mTextView.getLayout(); 649241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov if (layout == null) { 649341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", -1, actual); 649441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov return; 649541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 649641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 649741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the line which corresponds to the Y position 649841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int line = layout.getLineForVertical(y + mTextView.getScrollY()); 649941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the offset in that line that corresponds to the X position 650041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int expected = layout.getOffsetForHorizontal(line, x + mTextView.getScrollX()); 650141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", expected, actual); 650241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 650341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6504a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 65054b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetOffsetForPosition() throws Throwable { 650641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 65074b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, () -> { 650841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setText(LONG_TEXT); 650941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setPadding(0, 0, 0, 0); 651041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov }); 651141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 651241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertNotNull(mTextView.getLayout()); 651341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewWidth = mTextView.getWidth(); 651441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewHeight = mTextView.getHeight(); 651541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int lineHeight = mTextView.getLineHeight(); 651641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 651741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, 0); 651841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, viewHeight / 2); 651941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 3, lineHeight / 2); 652041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 2, viewHeight / 2); 652141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth, viewHeight); 652241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 652341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 652457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @UiThreadTest 6525a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 652657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void testOnResolvePointerIcon() throws InterruptedException { 652757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView selectableTextView = findTextView(R.id.textview_pointer); 652857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final MotionEvent event = createMouseHoverEvent(selectableTextView); 652957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 653057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable view shows the I beam 653157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 653257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 653357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 653457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 653557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(false); 653657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 653757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A clickable view shows the hand 653857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setLinksClickable(true); 653957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri SpannableString builder = new SpannableString("hello world"); 654057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setText(builder, BufferType.SPANNABLE); 654157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri Spannable text = (Spannable) selectableTextView.getText(); 654257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri text.setSpan( 654357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri new ClickableSpan() { 654457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @Override 654557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void onClick(View widget) { 654657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 654757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 654857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri }, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 654957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 655057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 655157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 655257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 655357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable & clickable view shows hand 655457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 655557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 655657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 655757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 655857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 655957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // An editable view shows the I-beam 656057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView editableTextView = new EditText(mActivity); 656157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 656257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 656357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri editableTextView.onResolvePointerIcon(event, 0)); 656457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 656557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 65669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65676b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapInside() throws Throwable { 65689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 65709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 65719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(1)).onClick(mTextView); 65729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65756b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDoubleTapInside() throws Throwable { 65769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDoubleTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 65789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 6579db34dc417570084e1598de3a6ebdacab4bbf1d66Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(2)).onClick(mTextView); 65809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65836b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapOutside() throws Throwable { 65849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosOutside, 65869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosOutside); 65879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 65889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 65899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 65916b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDragOutside() throws Throwable { 65929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 65939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int[] viewOnScreenXY = new int[2]; 65949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLocationOnScreen(viewOnScreenXY); 65959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 65969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SparseArray<Point> swipeCoordinates = new SparseArray<>(); 65979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(0, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside, 65989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside)); 65999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(1, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside + 50, 66009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside + 50)); 66019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDragGesture(mInstrumentation, swipeCoordinates); 66029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 66039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 66049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 6605771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @UiThreadTest 6606771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 6607771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu public void testOnInitializeA11yNodeInfo_populatesHintTextProperly() { 6608771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6609771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText("", BufferType.EDITABLE); 6610771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String hintText = "Hint text"; 6611771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setHint(hintText); 6612771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); 6613771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6614771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6615771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not showing as accessibility text", 6616771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getText())); 6617771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6618771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6619771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6620771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String nonHintText = "Something else"; 6621771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText(nonHintText, BufferType.EDITABLE); 6622771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6623771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertFalse("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6624771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Text not provided to accessibility", 6625771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(nonHintText, info.getText())); 6626771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6627771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6628771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6629771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 66305b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu @Test 6631ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public void testAutosizeWithMaxLines_shouldNotThrowException() throws Throwable { 6632ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov // the layout contains an instance of CustomTextViewWithTransformationMethod 6633ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov final TextView textView = (TextView) mActivity.getLayoutInflater() 6634ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov .inflate(R.layout.textview_autosize_maxlines, null); 6635ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertTrue(textView instanceof CustomTextViewWithTransformationMethod); 6636ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertEquals(1, textView.getMaxLines()); 6637ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6638ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 6639ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6640ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6641ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public static class CustomTextViewWithTransformationMethod extends TextView { 6642ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context) { 6643ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context); 6644ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6645ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6646ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6647ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6648ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs) { 6649ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs); 6650ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6651ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6652ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6653ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6654ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs, int defStyleAttr) { 6655ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs, defStyleAttr); 6656ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6657ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6658ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6659ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6660ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 6661ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs, defStyleAttr, defStyleRes); 6662ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6663ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6664ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6665ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov private void init() { 6666ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov setTransformationMethod(new SingleLineTransformationMethod()); 6667ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6668ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6669ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6670ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Test 667195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu public void testAutoSizeCallers_setText() throws Throwable { 667295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 667395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu R.id.textview_autosize_uniform, false); 667495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 667595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // Configure layout params and auto-size both in pixels to dodge flakiness on different 667695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // devices. 667795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 667895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 500, 500); 667995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 668095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setLayoutParams(layoutParams); 668195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setAutoSizeTextTypeUniformWithConfiguration( 668295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 1, 5000, 1, TypedValue.COMPLEX_UNIT_PX); 668395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu }); 668495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 668595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 668695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final String initialText = "13characters "; 668795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu StringBuilder textToSet = new StringBuilder().append(initialText); 668895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 668995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // As we add characters the text size shrinks. 669095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu for (int i = 0; i < 10; i++) { 669195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 669295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 669395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 669495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu float expectedLargerSize = autoSizeTextView.getTextSize(); 669595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 669695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu textToSet.append(initialText); 669795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 669895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 669995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 670095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 670195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertTrue(expectedLargerSize > autoSizeTextView.getTextSize()); 670295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 670395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 670495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // As we remove characters the text size expands. 670595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu for (int i = 9; i >= 0; i--) { 670695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 670795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 670895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 670995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu float expectedSmallerSize = autoSizeTextView.getTextSize(); 671095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 671195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu textToSet.replace((textToSet.length() - initialText.length()), textToSet.length(), ""); 671295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 671395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 671495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 671595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 671695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > expectedSmallerSize); 671795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 671895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 671995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 672095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu @Test 672176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testAutoSize_setEllipsize() throws Throwable { 672276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById( 672376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 672476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeType = textView.getAutoSizeTextType(); 672576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMinTextSize = textView.getAutoSizeMinTextSize(); 672676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMaxTextSize = textView.getAutoSizeMaxTextSize(); 672776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeGranularity = textView.getAutoSizeStepGranularity(); 672876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialSizes = textView.getAutoSizeTextAvailableSizes().length; 672976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 673076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(null, textView.getEllipsize()); 673176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Verify styled attributes. 673276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, initialAutoSizeType); 673376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMinTextSize); 673476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMaxTextSize); 673576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Because this TextView has been configured to use predefined sizes. 673676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, initialAutoSizeGranularity); 673776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, initialSizes); 673876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 673976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 674076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 674176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 674276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 674376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 674476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Beside the ellipsis no auto-size attribute has changed. 674576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeType, textView.getAutoSizeTextType()); 674676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMinTextSize, textView.getAutoSizeMinTextSize()); 674776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMaxTextSize, textView.getAutoSizeMaxTextSize()); 674876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeGranularity, textView.getAutoSizeStepGranularity()); 674976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialSizes, textView.getAutoSizeTextAvailableSizes().length); 675076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 675176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 675276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 675376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testEllipsize_setAutoSize() throws Throwable { 675476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu TextView textView = findTextView(R.id.textview_text); 675576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 675676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 675776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 675855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 675976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 676076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 676176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 676276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 676376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 676476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(0, textView.getAutoSizeTextAvailableSizes().length); 676576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 676676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 676776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 676855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 676976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 677076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 677176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // The auto-size defaults have been used. 677276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMinTextSize()); 677376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMaxTextSize()); 677476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeStepGranularity()); 677576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, textView.getAutoSizeTextAvailableSizes().length); 677676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 677776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 677876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 6779cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawables() throws Throwable { 6780069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67819000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6782069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6783cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6784c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6785cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6786cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setCompoundDrawables(drawable, drawable, drawable, drawable)); 6787cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6788069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6789069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6790cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6791cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6792cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6793cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablesRelative() throws Throwable { 6794069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 67959000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6796069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6797cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6798c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6799cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablesRelative( 6800cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6801cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6802069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6803069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6804cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6805cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6806cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6807cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablePadding() throws Throwable { 6808069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68099000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6810cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // Prepare a larger layout in order not to hit the min value easily. 6811cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6812cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setWidth(autoSizeTextView.getWidth() * 2); 6813cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setHeight(autoSizeTextView.getHeight() * 2); 6814cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu }); 6815cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 6816cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Setup the drawables before setting their padding in order to modify the available 6817cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // space and trigger a resize. 6818cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6819cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 4, autoSizeTextView.getHeight() / 4); 6820cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawables( 6821cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6822cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6823069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6824cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablePadding( 6825cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.getCompoundDrawablePadding() + 10)); 6826cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6827069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6828069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6829cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6830cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6831cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6832cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPadding() throws Throwable { 6833069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68349000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6835069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6836c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPadding( 6837c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6838c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6839cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6840069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6841069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6842cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6843cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6844cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6845cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPaddingRelative() throws Throwable { 6846069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68479000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6848069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6849cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6850c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPaddingRelative( 6851c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 6852c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 6853cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6854069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6855069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6856cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6857cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6858cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6859cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTextScaleX() throws Throwable { 6860069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68619000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6862069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6863cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6864cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6865069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX() * 4.5f)); 6866cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6867069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6868069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6869069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6870069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6871cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6872cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX())); 6873cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6874069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6875069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6876cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6877cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6878cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6879cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTypeface() throws Throwable { 6880069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 68819000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6882069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6883069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setText("The typeface change needs a bit more text then " 6884069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the default used for this batch of tests in order to get to resize text." 6885069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + " The resize function is always called but even with different typefaces " 6886069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "there may not be a need to resize text because it just fits. The longer " 6887069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the text, the higher the chance for a resize. And here is yet another " 6888069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "sentence to make sure this test is not flaky. Not flaky at all.")); 6889069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6890069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6891cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6892c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 6893c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu Typeface differentTypeface = Typeface.MONOSPACE; 6894c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu if (autoSizeTextView.getTypeface() == Typeface.MONOSPACE) { 6895c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu differentTypeface = Typeface.SANS_SERIF; 6896c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu } 6897c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setTypeface(differentTypeface); 6898c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu }); 6899cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6900069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6901069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6902069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Don't really know if it is larger or smaller (depends on the typeface chosen above), 6903069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // but it should definitely have changed. 6904069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertNotEquals(initialTextSize, changedTextSize, 0f); 6905069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6906cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6907cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTypeface(autoSizeTextView.getTypeface())); 6908cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6909069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6910069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6911cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6912cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6913cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6914cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLetterSpacing() throws Throwable { 6915069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69169000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6917069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6918cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6919cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6920c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // getLetterSpacing() could return 0, make sure there is enough of a difference to 6921c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // trigger auto-size. 6922c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setLetterSpacing( 6923069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLetterSpacing() * 1.5f + 4.5f)); 6924cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6925069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 6926cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6927069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 6928c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 6929cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6930069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setLetterSpacing(autoSizeTextView.getLetterSpacing())); 6931cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6932069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6933069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 6934cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6935cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6936cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6937cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHorizontallyScrolling() throws Throwable { 6938069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69399000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6940697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu // Verify that we do not have horizontal scrolling turned on. 6941697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(!autoSizeTextView.getHorizontallyScrolling()); 6942697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu 6943069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6944697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(true)); 6945cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6946697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 6947069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6948697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(false)); 6949cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6950697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 6951cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6952cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6953cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6954cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxLines() throws Throwable { 6955069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69569000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6957069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6958cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(1)); 6959cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6960069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6961069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6962cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6963cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6964cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6965cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxHeight() throws Throwable { 6966069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69679000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6968069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6969069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6970069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6971069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6972069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6973069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6974069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6975c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxHeight( 6976069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6977cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6978069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6979069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6980cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6981cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6982cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6983cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHeight() throws Throwable { 6984069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69859000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 6986069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 6987069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6988069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 6989069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 6990069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 6991069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6992069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6993c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 6994c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getHeight() / 4)); 6995cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6996069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6997069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6998cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6999cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7000cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7001cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLines() throws Throwable { 7002069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70039000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7004069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7005069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLines(1)); 7006cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7007069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7008069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7009cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7010cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7011cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7012cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxWidth() throws Throwable { 7013069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70149000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7015cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width only. 7016cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7017cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7018069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 7019cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7020cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7021069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7022c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxWidth( 7023c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 7024cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7025069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7026069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 7027cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7028cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7029cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7030cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setWidth() throws Throwable { 7031069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70329000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7033069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact width only. 7034069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7035069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7036069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 7037069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7038069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7039cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7040069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7041c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setWidth( 7042c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 7043cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7044069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7045069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 7046cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7047cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7048cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7049cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLineSpacing() throws Throwable { 7050069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70519000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7052069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7053c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 7054cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 7055069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra() * 4, 7056069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier() * 4)); 7057cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7058069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 7059069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7060069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 7061069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7062cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 7063cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra(), 7064cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier())); 7065cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7066069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7067069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 7068069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu } 7069069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7070069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu @Test 7071069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu public void testAutoSizeCallers_setTextSizeIsNoOp() throws Throwable { 7072069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70739000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7074069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7075069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7076069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setTextSize( 7077069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu initialTextSize + 123f)); 7078069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7079069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7080069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 7081cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7082cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7083cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 708455eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu public void testAutoSizeCallers_setHeightForOneLineText() throws Throwable { 708555eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final TextView autoSizeTextView = (TextView) mActivity.findViewById( 708655eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu R.id.textview_autosize_basic); 708755eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, autoSizeTextView.getAutoSizeTextType()); 708855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 708955eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 709055eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu autoSizeTextView.getHeight() * 3)); 709155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 709255eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 709355eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 709455eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu } 709555eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 709655eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu @Test 70979000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributes() { 70985b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 70999000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 71009000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 71015b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 71029000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // The size has been set to 50dp in the layout but this being an AUTO_SIZE_TEXT_TYPE_UNIFORM 7103771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // TextView, the size is considered max size thus the value returned by getSize() in this 7104771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // case should be lower than the one set (given that there is not much available space and 7105771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // the font size is very high). In theory the values could be equal for a different TextView 71065b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu // configuration. 71075b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu final float sizeSetInPixels = TypedValue.applyDimension( 71085b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu TypedValue.COMPLEX_UNIT_DIP, 50f, metrics); 71099000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertTrue(autoSizeTextViewUniform.getTextSize() < sizeSetInPixels); 71105b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu } 71115b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 71124f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver @Test 71139000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesUsingPredefinedSizes() { 7114cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu DisplayMetrics m = mActivity.getResources().getDisplayMetrics(); 71159000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 71169000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 711755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 711855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 10px, 10dp, 10sp, 10pt, 10in and 10mm. 7119cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // TypedValue can not use the math library and instead naively ceils the value by adding 7120cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // 0.5f when obtaining styled attributes. Check TypedValue#complexToDimensionPixelSize(...) 7121cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu int[] expectedSizesInPx = new int[] { 7122cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 10f, m)), 7123cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, m)), 7124cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10f, m)), 7125cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 10f, m)), 7126cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 10f, m)), 7127cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10f, m))}; 712855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 712955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu boolean containsValueFromExpectedSizes = false; 71309000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu int textSize = (int) autoSizeTextViewUniform.getTextSize(); 7131cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu for (int i = 0; i < expectedSizesInPx.length; i++) { 7132cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu if (expectedSizesInPx[i] == textSize) { 713355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu containsValueFromExpectedSizes = true; 713455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu break; 713555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 713655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 713755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(containsValueFromExpectedSizes); 713855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 713955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 714055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 71419000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesPredefinedSizesFiltering() { 71429000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 71439000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes_redundant_values); 714455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 714555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 40px, 10px, 10px, 10px, 0dp. 714655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] expectedSizes = new int[] {10, 40}; 71479000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(expectedSizes, autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 714855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 714955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 715055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 71519000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesFilteringAndSorting() throws Throwable { 715255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 715355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 715455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 715555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[] {400, 0, 10, 40, 10, 10, 0, 0}; 7156cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7157cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 715855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 71599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(new int[] {10, 40, 400}, mTextView.getAutoSizeTextAvailableSizes()); 716055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 716155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 716255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test(expected = NullPointerException.class) 71639000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesNullArray() throws Throwable { 716455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 716555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 716655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 716755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = null; 7168cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7169cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 717055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 717155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 717255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 717355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 71749000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesEmptyArray() throws Throwable { 717555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 717655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 717755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 717855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7179cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 718055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 718155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 71829000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] defaultSizes = mTextView.getAutoSizeTextAvailableSizes(); 718355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 718455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(defaultSizes.length > 0); 718555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 718655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[0]; 7187cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7188cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 718955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 719055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 71919000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] newSizes = mTextView.getAutoSizeTextAvailableSizes(); 719255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 719355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals(defaultSizes, newSizes); 719455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 719555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 719655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 71979000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_buildsSizes() throws Throwable { 71989000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 71999000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 720055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 720155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // Verify that the interval limits are both included. 7202cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7203cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration(10, 20, 2, 7204cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 720555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 720655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 720755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 72089000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 720955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7210cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7211cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7212cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7213cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 19, 7214cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7215cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 721655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 721755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 721855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18}, 72199000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 722055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7221cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7222cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7223cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7224cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 21, 7225cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7226cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 722755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 722855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 722955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 72309000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 723155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 723255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 723355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 72349000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeTextDefaults() { 72354f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver final TextView textView = new TextView(mActivity); 7236771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7237771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max/Granularity values for auto-sizing are 0 because they are not used. 7238cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7239cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7240cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7241771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7242cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 72439000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7244771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max default values for auto-sizing XY have been loaded. 7245771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7246771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 724755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(0 < minSize); 7248771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue(minSize < maxSize); 724955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotEquals(0, textView.getAutoSizeStepGranularity()); 7250771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7251cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE); 7252771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7253771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max values for auto-sizing XY have been cleared. 7254cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7255cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7256cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7257771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7258771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7259771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 72609000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeStepGranularity() { 7261771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7262771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7263cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final int initialValue = -1; 7264771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(initialValue, textView.getAutoSizeStepGranularity()); 72654f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7266cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 72679000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7268771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int defaultValue = 1; // 1px. 72699000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // If the auto-size type is AUTO_SIZE_TEXT_TYPE_UNIFORM then it means textView went through 72709000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // the auto-size setup and given that 0 is an invalid value it changed it to the default. 7271771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(defaultValue, textView.getAutoSizeStepGranularity()); 7272771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7273771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newValue = 33; 7274cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7275cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7276cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7277cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newValue, 7278cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7279771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newValue, textView.getAutoSizeStepGranularity()); 7280771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7281771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7282771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 72839000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMinTextSize() { 7284771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7285cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 72869000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7287771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7288771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7289771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7290771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7291771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7292771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // This is just a test check to verify the next assertions. If this fails it is a problem 7293771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // of this test setup (we need at least 2 units). 7294771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue((maxSize - minSize) > 1); 7295771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMinSize = maxSize - 1; 7296cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7297cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7298cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7299cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7300cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7301cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7302771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMinSize, textView.getAutoSizeMinTextSize()); 7303771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Max size has not changed. 7304771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(maxSize, textView.getAutoSizeMaxTextSize()); 7305771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7306cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7307cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7308cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize + 10, 7309cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7310cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7311cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7312771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the min size, the getter always 7313771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 731495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMinSize, 731595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivity.getResources().getDisplayMetrics())), textView.getAutoSizeMinTextSize()); 7316771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7317771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7318cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 73199000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_throwsException_whenMaxLessThanMin() { 7320771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7321cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7322cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7323cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7324cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7325cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7326cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_minLessThanZero() { 7327cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7328cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7329cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu -1, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7330cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7331cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7332cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7333cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_maxLessThanZero() { 7334cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7335cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7336cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, -1, 1, TypedValue.COMPLEX_UNIT_SP); 7337cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7338cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7339cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7340cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_granularityLessThanZero() { 7341cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7342cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7343cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 20, -1, TypedValue.COMPLEX_UNIT_SP); 7344771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7345771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7346771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 73470716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu public void testAutoSizeUniform_equivalentConfigurations() throws Throwable { 73480716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final DisplayMetrics dm = mActivity.getResources().getDisplayMetrics(); 73490716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int minTextSize = 10; 73500716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int maxTextSize = 20; 73510716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int granularity = 2; 73520716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int unit = TypedValue.COMPLEX_UNIT_SP; 73530716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73540716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final TextView granularityTextView = new TextView(mActivity); 73550716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.setAutoSizeTextTypeUniformWithConfiguration( 73560716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu minTextSize, maxTextSize, granularity, unit); 73570716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73580716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final TextView presetTextView = new TextView(mActivity); 73590716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.setAutoSizeTextTypeUniformWithPresetSizes( 73600716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu new int[] {minTextSize, 12, 14, 16, 18, maxTextSize}, unit); 73610716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73620716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // The TextViews have been configured differently but the end result should be nearly 73630716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // identical. 73640716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedAutoSizeType = TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM; 73650716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedAutoSizeType, granularityTextView.getAutoSizeTextType()); 73660716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedAutoSizeType, presetTextView.getAutoSizeTextType()); 73670716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73680716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedMinTextSizeInPx = Math.round( 73690716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu TypedValue.applyDimension(unit, minTextSize, dm)); 73700716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMinTextSizeInPx, granularityTextView.getAutoSizeMinTextSize()); 73710716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMinTextSizeInPx, presetTextView.getAutoSizeMinTextSize()); 73720716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73730716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedMaxTextSizeInPx = Math.round( 73740716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu TypedValue.applyDimension(unit, maxTextSize, dm)); 73750716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMaxTextSizeInPx, granularityTextView.getAutoSizeMaxTextSize()); 73760716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMaxTextSizeInPx, presetTextView.getAutoSizeMaxTextSize()); 73770716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73780716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configured with granularity. 73790716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(unit, granularity, dm)), 73800716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.getAutoSizeStepGranularity()); 73810716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configured with preset values, there is no granularity. 73820716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(-1, presetTextView.getAutoSizeStepGranularity()); 73830716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73840716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Both TextViews generate exactly the same sizes in pixels to choose from when auto-sizing. 738595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertArrayEquals("Expected the granularity and preset configured auto-sized " 738695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "TextViews to have identical available sizes for auto-sizing." 738795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "\ngranularity sizes: " 738895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + Arrays.toString(granularityTextView.getAutoSizeTextAvailableSizes()) 738995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "\npreset sizes: " 739095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + Arrays.toString(presetTextView.getAutoSizeTextAvailableSizes()), 73910716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.getAutoSizeTextAvailableSizes(), 73920716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.getAutoSizeTextAvailableSizes()); 73930716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 73940716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final String someText = "This is a string"; 739595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 739695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 500, 500); 73970716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configure identically and attach to layout. 73980716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 739995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu granularityTextView.setLayoutParams(layoutParams); 740095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu presetTextView.setLayoutParams(layoutParams); 740195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 74020716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu LinearLayout ll = mActivity.findViewById(R.id.layout_textviewtest); 740395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu ll.removeAllViews(); 74040716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu ll.addView(granularityTextView); 74050716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu ll.addView(presetTextView); 74060716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 74070716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.setText(someText); 74080716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.setText(someText); 74090716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu }); 74100716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 74110716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 74120716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(granularityTextView.getTextSize(), presetTextView.getTextSize(), 0f); 74130716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu } 74140716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 74150716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu @Test 74169000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMaxTextSize() { 7417771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7418cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 74199000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7420771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7421771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7422771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7423771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7424771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7425771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMaxSize = maxSize + 11; 7426cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7427cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7428cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7429cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7430cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7431cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7432771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMaxSize, textView.getAutoSizeMaxTextSize()); 7433771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min size has not changed. 7434771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(minSize, textView.getAutoSizeMinTextSize()); 7435cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7436cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7437cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7438cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7439cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7440771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the max size, the getter always 7441771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 74420716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMaxSize, 74430716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mActivity.getResources().getDisplayMetrics())), textView.getAutoSizeMaxTextSize()); 74444f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver } 74454f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7446771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 74479000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_autoSizeCalledWhenTypeChanged() throws Throwable { 7448771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 7449771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Make sure we pick an already inflated non auto-sized text view. 7450771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 7451771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Set the text size to a very low value in order to prepare for auto-size. 7452771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int customTextSize = 3; 7453771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7454771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, customTextSize)); 7455771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7456771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(customTextSize, mTextView.getTextSize(), 0f); 7457771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7458cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 7459771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7460771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // The size of the text should have changed. 7461771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(customTextSize, mTextView.getTextSize(), 0f); 7462771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 74634f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7464ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki @Test 7465ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki public void testSmartSelection() throws Throwable { 7466ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView = findTextView(R.id.textview_text); 7467ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 7468ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int startIndex = text.indexOf("president"); 7469ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int endIndex = startIndex + "president".length(); 747009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 7471ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 747209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 7473ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 747409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 747509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 747609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 7477ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // TODO: Test the floating toolbar content. 7478ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 747909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 74804d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov private boolean isWatch() { 74814d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov return (mActivity.getResources().getConfiguration().uiMode 74824d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov & Configuration.UI_MODE_TYPE_WATCH) == Configuration.UI_MODE_TYPE_WATCH; 74834d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov } 74844d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov 748509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 748609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_dragSelection() throws Throwable { 74874d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov if (isWatch()) { 74884d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov return; 74894d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov } 749009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 749109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 749209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("is coming to town"); 749309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "is coming to town".length(); 749409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 749509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 749609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point start = getCenterPositionOfTextAt(mTextView, startIndex, startIndex); 749709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point end = getCenterPositionOfTextAt(mTextView, endIndex, endIndex); 749809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int[] viewOnScreenXY = new int[2]; 749909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.getLocationOnScreen(viewOnScreenXY); 750009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startX = start.x + viewOnScreenXY[0]; 750109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startY = start.y + viewOnScreenXY[1]; 750209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int offsetX = end.x - start.x; 750309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 750409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Perform drag selection. 750509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressAndDragGesture( 750609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mInstrumentation, startX, startY, offsetX, 0 /* offsetY */); 750709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 750809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // No smart selection on drag selection. 750909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(startIndex, mTextView.getSelectionStart()); 751009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(endIndex, mTextView.getSelectionEnd()); 751109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 751209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 751309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 751409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_resetSelection() throws Throwable { 751509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 751609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 751709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("president"); 751809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "president".length(); 751909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 752009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 752109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 752209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 752309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 752409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 752509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 752609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 75275a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap to reset selection. Expect tapped word to be selected. 75285a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki startIndex = text.indexOf("Filip"); 75295a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki endIndex = startIndex + "Filip".length(); 75305a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 753109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 75325a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selStart = startIndex; 75335a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selEnd = endIndex; 75345a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == selStart 75355a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki && mTextView.getSelectionEnd() == selEnd); 753609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 75375a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap one more time to dismiss the selection. 753809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 753909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertFalse(mTextView.hasSelection()); 754009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 754109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 75421f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75431f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlFamilyName() { 75441f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_fontfamily); 75451f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 75461f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75471f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75481f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 75491f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75501f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75511f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlFamilyName() { 75521f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 75531f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 75541f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75551f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75561f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 75571f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75581f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75591f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlStyle() { 75601f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_style); 75611f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 75621f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75631f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75641f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 75651f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75661f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75671f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlStyle() { 75681f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_style); 75691f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 75701f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75711f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75721f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 75731f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75741f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75751f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlTextAppearance() { 75761f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_textAppearance); 75771f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 75781f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75791f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75801f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 75811f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 75821f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 75832d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri public void testFontResourcesXml_setInXmlWithStyle() { 75842d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 75852d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 75862d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 75872d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 75882d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 75892d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_withStyle); 75902d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 75912d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface resultTypeface = mTextView.getTypeface(); 75922d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertNotEquals(resultTypeface, expected); 75932d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.create(expected, Typeface.ITALIC), resultTypeface); 75942d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.ITALIC, resultTypeface.getStyle()); 75952d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri } 75962d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 75972d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri @Test 75981f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlTextAppearance() { 75991f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_textAppearance); 76001f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 76011f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 76021f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 76031f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 7604ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 76055705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @Test 76065705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @MediumTest 76075705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri public void testFontResourcesXml_restrictedContext() 76085705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri throws PackageManager.NameNotFoundException { 76095705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context restrictedContext = mActivity.createPackageContext(mActivity.getPackageName(), 76105705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.CONTEXT_RESTRICTED); 76115705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri LayoutInflater layoutInflater = (LayoutInflater) restrictedContext.getSystemService( 76125705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.LAYOUT_INFLATER_SERVICE); 76135705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri View root = layoutInflater.inflate(R.layout.textview_restricted_layout, null); 76145705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 76155705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_fontfamily); 76165705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76175705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_fontfamily); 76185705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76195705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_nonFontReference); 76205705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76215705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_style); 76225705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76235705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_style); 76245705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76255705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_textAppearance); 76265705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76275705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_textAppearance); 76285705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 76295705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri } 76305705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 763109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void initializeTextForSmartSelection(CharSequence text) throws Throwable { 763209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertTrue(text.length() >= SMARTSELECT_END); 763309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki TextClassifier mockClassifier = mock(TextClassifier.class); 763409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki when(mockClassifier.suggestSelection( 76355ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 763609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki .thenReturn(new TextSelection.Builder(SMARTSELECT_START, SMARTSELECT_END).build()); 76370ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Toki when(mockClassifier.classifyText( 76385ca9749877f2e16460f9a5de1d4d362f90705cbaAbodunrinwa Toki any(CharSequence.class), anyInt(), anyInt(), any(LocaleList.class))) 76390ce07e984c6133dc7e2aab6133e71ba31fb43f1bAbodunrinwa Toki .thenReturn(new TextClassification.Builder().build()); 7640cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mActivityRule.runOnUiThread(() -> { 7641cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setTextIsSelectable(true); 764259aeb3c1ff371b5ed015487cbc11a15696f44d43Abodunrinwa Toki mTextView.setText(text); 764309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.setTextClassifier(mockClassifier); 764459aeb3c1ff371b5ed015487cbc11a15696f44d43Abodunrinwa Toki mTextView.requestFocus(); 7645cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki }); 7646cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mInstrumentation.waitForIdleSync(); 764709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7648cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 764909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateClickOnView(View view, int offsetX, int offsetY) { 765009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateTapOnView(mInstrumentation, view, offsetX, offsetY); 765109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 765209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 7653cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 765409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateLongPressOnView(View view, int offsetX, int offsetY) { 765509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressOnView(mInstrumentation, view, offsetX, offsetY); 765609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // TODO: Ideally, we shouldn't have to wait for a click timeout after a long-press but it 765709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // seems like we have a minor bug (call it inconvenience) in TextView that requires this. 765809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 7659cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki } 7660cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 76619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu /** 7662069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * Some TextView attributes require non-fixed width and/or layout height. This function removes 7663069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * all other existing views from the layout leaving only one auto-size TextView (for exercising 7664069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * the auto-size behavior) which has been set up to suit the test needs. 7665cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7666069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @param viewId The id of the view to prepare. 7667cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * @param shouldWrapLayoutContent Specifies if the layout params should wrap content 7668cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 7669069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @return a TextView configured for auto size tests. 7670cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu */ 7671069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu private TextView prepareAndRetrieveAutoSizeTestData(final int viewId, 7672cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final boolean shouldWrapLayoutContent) throws Throwable { 7673cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7674cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 7675069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu TextView targetedTextView = (TextView) mActivity.findViewById(viewId); 7676cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu ll.removeAllViews(); 7677069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu ll.addView(targetedTextView); 7678cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu }); 7679cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7680cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7681069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById(viewId); 7682cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu if (shouldWrapLayoutContent) { 7683cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width or height. 7684cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7685cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7686cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 7687069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7688069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu textView.setLayoutParams(layoutParams); 7689069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu }); 7690cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7691cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7692cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7693069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu return textView; 7694cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7695cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7696cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu /** 76979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * Removes all existing views from the layout and adds a basic TextView (for exercising the 76989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * ClickableSpan onClick() behavior) in order to prevent scrolling. Adds a ClickableSpan to the 76999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * TextView and returns the ClickableSpan and position details about it to be used in individual 77009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * tests. 77019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu */ 77026b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu private ClickableSpanTestDetails prepareAndRetrieveClickableSpanDetails() throws Throwable { 77036b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 77049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 77059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.removeAllViews(); 77069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 77079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.addView(mTextView); 77089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 77099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 77109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mockTextLink = mock(ClickableSpan.class); 77129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu StringBuilder textViewContent = new StringBuilder(); 77139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu String clickableString = "clickMe!"; 77149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(clickableString); 77159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int startPos = 0; 77169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu // Insert more characters to make some room for swiping. 77189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu for (int i = 0; i < 200; i++) { 77199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(" text"); 77209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 77219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SpannableString spannableString = new SpannableString(textViewContent); 77229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int endPos = clickableString.length(); 77239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spannableString.setSpan(mockTextLink, startPos, endPos, 0); 77246b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 77259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(spannableString); 77269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 77279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 77289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 77299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu return new ClickableSpanTestDetails(mockTextLink, mTextView, startPos, endPos); 77319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 77329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private static final class ClickableSpanTestDetails { 77349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mClickableSpan; 77359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosInside; 77369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosInside; 77379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosOutside; 77389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosOutside; 77399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mStartCharPos; 77419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mEndCharPos; 77429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mParent; 77439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails(ClickableSpan clickableSpan, TextView parent, 77459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int startCharPos, int endCharPos) { 77469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mClickableSpan = clickableSpan; 77479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mParent = parent; 77489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mStartCharPos = startCharPos; 77499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mEndCharPos = endCharPos; 77509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu calculatePositions(); 77529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 77539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void calculatePositions() { 775500b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) mParent.getLayout().getPrimaryHorizontal(mStartCharPos, true); 775600b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) mParent.getLayout().getPrimaryHorizontal(mEndCharPos, true); 77579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int line = mParent.getLayout().getLineForOffset(mEndCharPos); 77589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yTop = mParent.getLayout().getLineTop(line); 77599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yBottom = mParent.getLayout().getLineBottom(line); 77609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 77619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosInside = (xStart + xEnd) / 2; 77629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosInside = (yTop + yBottom) / 2; 77639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosOutside = xEnd + 1; 77649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosOutside = yBottom + 1; 77659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 77669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 77679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 776857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri private MotionEvent createMouseHoverEvent(View view) { 776957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] xy = new int[2]; 777057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri view.getLocationOnScreen(xy); 777157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewWidth = view.getWidth(); 777257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewHeight = view.getHeight(); 777357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float x = xy[0] + viewWidth / 2.0f; 777457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float y = xy[1] + viewHeight / 2.0f; 777557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri long eventTime = SystemClock.uptimeMillis(); 777657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 777757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0] = new MotionEvent.PointerCoords(); 777857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].x = x; 777957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].y = y; 778057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] pointerIds = new int[1]; 778157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerIds[0] = 0; 778257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri return MotionEvent.obtain(0, eventTime, MotionEvent.ACTION_HOVER_MOVE, 1, pointerIds, 778357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords, 0, 0, 0, 0, 0, InputDevice.SOURCE_MOUSE, 0); 778457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 778557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 77869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final TextView textView) throws Throwable { 77879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(textView)); 7788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 77919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final int layoutId) throws Throwable { 77929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layoutId)); 7793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView findTextView(int id) { 7797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return (TextView) mActivity.findViewById(id); 7798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private int getAutoLinkMask(int id) { 7801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return findTextView(id).getAutoLinkMask(); 7802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxLines(final int lines) throws Throwable { 78059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxLines(lines)); 78066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 78076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 78086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 78099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxWidth(final int pixels) throws Throwable { 78109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxWidth(pixels)); 7811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinWidth(final int pixels) throws Throwable { 78159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinWidth(pixels)); 7816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxHeight(final int pixels) throws Throwable { 78209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxHeight(pixels)); 7821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinHeight(final int pixels) throws Throwable { 78259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinHeight(pixels)); 7826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinLines(final int minLines) throws Throwable { 78309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinLines(minLines)); 7831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And 7836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * the buffer type is fixed to SPANNABLE. 7837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * 7838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param tv the text view 7839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param content the content 7840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 78419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setSpannableText(final TextView tv, final String content) throws Throwable { 78429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> tv.setText(content, BufferType.SPANNABLE)); 7843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78464b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLines(final int lines) throws Throwable { 78479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLines(lines)); 7848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78514b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHorizontallyScrolling(final boolean whether) throws Throwable { 78529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHorizontallyScrolling(whether)); 7853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78564b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setWidth(final int pixels) throws Throwable { 78579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setWidth(pixels)); 7858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78614b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHeight(final int pixels) throws Throwable { 78629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHeight(pixels)); 7863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78664b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMinEms(final int ems) throws Throwable { 78679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinEms(ems)); 7868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMaxEms(final int ems) throws Throwable { 78729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxEms(ems)); 7873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78764b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setEms(final int ems) throws Throwable { 78779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setEms(ems)); 7878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 78814b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLineSpacing(final float add, final float mult) throws Throwable { 78829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLineSpacing(add, mult)); 7883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 7884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7886ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki /** 7887ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * Returns the x, y coordinates of text at a specified indices relative to the position of the 7888ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * TextView. 7889ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * 7890ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param textView 7891ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param startIndex start index of the text in the textView 7892ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param endIndex end index of the text in the textView 7893ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki */ 7894ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki private static Point getCenterPositionOfTextAt( 7895ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki TextView textView, int startIndex, int endIndex) { 789600b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) textView.getLayout().getPrimaryHorizontal(startIndex, true); 789700b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) textView.getLayout().getPrimaryHorizontal(endIndex, true); 7898ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int line = textView.getLayout().getLineForOffset(endIndex); 7899ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yTop = textView.getLayout().getLineTop(line); 7900ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yBottom = textView.getLayout().getLineBottom(line); 7901ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7902ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki return new Point((xStart + xEnd) / 2 /* x */, (yTop + yBottom) / 2 /* y */); 7903ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 7904ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 7905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestSelectedRunnable implements Runnable { 7906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected1; 7908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected2; 7909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestSelectedRunnable(TextView textview) { 7911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected1() { 7915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected1; 7916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected2() { 7919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected2; 7920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected1() { 7923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected1 = mTextView.isSelected(); 7924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected2() { 7927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected2 = mTextView.isSelected(); 7928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestLayoutRunnable implements Runnable { 7932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 7933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Layout mLayout; 7934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestLayoutRunnable(TextView textview) { 7936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 7937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public Layout getLayout() { 7940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mLayout; 7941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveLayout() { 7944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mLayout = mTextView.getLayout(); 7945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static class MockTextWatcher implements TextWatcher { 7949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledAfterTextChanged; 7950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledBeforeTextChanged; 7951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasOnTextChanged; 7952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void reset(){ 7954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = false; 7955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = false; 7956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = false; 7957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledAfterTextChanged() { 7960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledAfterTextChanged; 7961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledBeforeTextChanged() { 7964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledBeforeTextChanged; 7965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledOnTextChanged() { 7968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasOnTextChanged; 7969fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void afterTextChanged(Editable s) { 7972fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = true; 7973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = true; 7977fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void onTextChanged(CharSequence s, int start, int before, int count) { 7980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = true; 7981fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7982fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 7983fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 7985277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook * A TextWatcher that converts the text to spaces whenever the text changes. 7986277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook */ 7987277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook private static class ConvertToSpacesTextWatcher implements TextWatcher { 7988277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook boolean mChangingText; 7989277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7990277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7991277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void beforeTextChanged(CharSequence s, int start, int count, int after) { 7992277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7993277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7994277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7995277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void onTextChanged(CharSequence s, int start, int before, int count) { 7996277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 7997277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 7998277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 7999277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void afterTextChanged(Editable s) { 8000277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Avoid infinite recursion. 8001277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook if (mChangingText) { 8002277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook return; 8003277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8004277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = true; 8005277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Create a string of s.length() spaces. 8006277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook StringBuilder builder = new StringBuilder(s.length()); 8007277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook for (int i = 0; i < s.length(); i++) { 8008277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook builder.append(' '); 8009277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8010277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook s.replace(0, s.length(), builder.toString()); 8011277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = false; 8012277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8013277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su} 8015