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; 29a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Matchers.eq; 30a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Matchers.refEq; 31a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doAnswer; 32a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doCallRealMethod; 33a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.doNothing; 34a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.mock; 35a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.never; 36a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.reset; 37a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.spy; 38a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.times; 39a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verify; 40a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verifyNoMoreInteractions; 41a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.verifyZeroInteractions; 42a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport static org.mockito.Mockito.when; 43be24fc17bf75d329d40d8acce9e22d8d3ff30f1fAurimas Liutikas 44ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport static java.lang.annotation.RetentionPolicy.SOURCE; 45ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 46fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Activity; 47fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation; 48fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.app.Instrumentation.ActivityMonitor; 49354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.content.Context; 50fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.Intent; 512751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonakaimport android.content.pm.PackageManager; 52fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.ColorStateList; 534d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikovimport android.content.res.Configuration; 54938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.content.res.Resources; 55fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.content.res.Resources.NotFoundException; 56fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Color; 57fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Paint; 58c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Tokiimport android.graphics.Paint.FontMetricsInt; 59afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.Path; 609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.graphics.Point; 61fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukaiimport android.graphics.PorterDuff; 62fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Rect; 63afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.graphics.RectF; 64fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.Typeface; 65fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.BitmapDrawable; 66ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.graphics.drawable.ColorDrawable; 67fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.graphics.drawable.Drawable; 68a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournaderimport android.icu.lang.UCharacter; 69fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.net.Uri; 70fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.os.Bundle; 71354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Handler; 72265b3d21959154e9a6ce0fdd888249f3699b7bddYohei Yukawaimport android.os.LocaleList; 73354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikovimport android.os.Looper; 745b51f77b99861d48fec1c327252416f726b3b01aJames Cookimport android.os.Parcelable; 7557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.os.SystemClock; 761701d1a1e469b1f00972e1512072331e097c48ceZhi An Ngimport androidx.annotation.IntDef; 771701d1a1e469b1f00972e1512072331e097c48ceZhi An Ngimport androidx.annotation.Nullable; 78a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.InstrumentationRegistry; 79a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.annotation.UiThreadTest; 803763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.MediumTest; 813763966148d1d014b62a1bd27a68021c5ca17240Kirill Grouchnikovimport android.support.test.filters.SmallTest; 82a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.rule.ActivityTestRule; 83a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport android.support.test.runner.AndroidJUnit4; 84fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Editable; 85fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputFilter; 86fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.InputType; 87fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Layout; 8882d73119016e321a8f90347bded84e25c87a0675Seigo Nonakaimport android.text.PrecomputedText; 89fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Selection; 90fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.Spannable; 91fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.SpannableString; 92ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonakaimport android.text.SpannableStringBuilder; 93ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.text.Spanned; 94fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextPaint; 95fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils; 96fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.TextUtils.TruncateAt; 97afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.TextWatcher; 98fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.ArrowKeyMovementMethod; 99fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateKeyListener; 100fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DateTimeKeyListener; 101fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DialerKeyListener; 102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.DigitsKeyListener; 103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.KeyListener; 104fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.LinkMovementMethod; 105fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.MovementMethod; 106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.PasswordTransformationMethod; 107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.QwertyKeyListener; 108fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.SingleLineTransformationMethod; 109fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TextKeyListener; 110afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.text.method.TextKeyListener.Capitalize; 111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TimeKeyListener; 112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.method.TransformationMethod; 11357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.text.style.ClickableSpan; 11498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinirimport android.text.style.ImageSpan; 115fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.style.URLSpan; 116ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagiimport android.text.style.UnderlineSpan; 117fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.text.util.Linkify; 118ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippovimport android.util.AttributeSet; 119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.DisplayMetrics; 1209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.util.SparseArray; 121fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.util.TypedValue; 122ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport android.view.ActionMode; 123fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.ContextMenu; 124fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.Gravity; 12557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.InputDevice; 126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.KeyEvent; 1275705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarriimport android.view.LayoutInflater; 12832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.Menu; 12957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.MotionEvent; 13057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarriimport android.view.PointerIcon; 131fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.view.View; 1329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewConfiguration; 133afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsuimport android.view.ViewGroup; 1349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanuimport android.view.ViewGroup.LayoutParams; 13532944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagiimport android.view.accessibility.AccessibilityNodeInfo; 13672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.BaseInputConnection; 13718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinirimport android.view.inputmethod.CompletionInfo; 13871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagiimport android.view.inputmethod.CorrectionInfo; 13972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.EditorInfo; 14072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedText; 14172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubachimport android.view.inputmethod.ExtractedTextRequest; 142c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cookimport android.view.inputmethod.InputConnection; 143ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextClassifier; 144ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Tokiimport android.view.textclassifier.TextSelection; 145c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunneimport android.widget.EditText; 146bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsuimport android.widget.FrameLayout; 14762808562ee0218f6ea3c07d333f7a65fc57c122fBrian Muramatsuimport android.widget.LinearLayout; 148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.Scroller; 149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView; 150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport android.widget.TextView.BufferType; 151938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport android.widget.cts.util.TestUtils; 152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1539259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsKeyEventUtil; 1549259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.CtsTouchUtils; 1559259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.PollingCheck; 1569259176007f5aad8fb9c79abb725b40c89327c40Aaron Holdenimport com.android.compatibility.common.util.WidgetTestUtils; 1579259176007f5aad8fb9c79abb725b40c89327c40Aaron Holden 158a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Before; 159a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Rule; 160a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.Test; 161a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovimport org.junit.runner.RunWith; 162938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikovimport org.mockito.invocation.InvocationOnMock; 163ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levienimport org.xmlpull.v1.XmlPullParserException; 164ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Suimport java.io.IOException; 166ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawaimport java.lang.annotation.Retention; 16795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanuimport java.util.Arrays; 168b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonakaimport java.util.Locale; 169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su/** 171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Test {@link TextView}. 172fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 173a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@MediumTest 174a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov@RunWith(AndroidJUnit4.class) 175a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikovpublic class TextViewTest { 176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Instrumentation mInstrumentation; 177a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private Activity mActivity; 178a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov private TextView mTextView; 1799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mSecondTextView; 180a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 181fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final String LONG_TEXT = "This is a really long string which exceeds " 1827375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "the width of the view. New devices have a much larger screen which " 1837375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "actually enables long strings to be displayed with no fading. " 1847375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "I have made this string longer to fix this case. If you are correcting " 1857375565c2caf62392b32049cafb7df0730373794Gilles Debunne + "this text, I would love to see the kind of devices you guys now use!"; 186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static final long TIMEOUT = 5000; 18709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 18809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_START = 0; 18909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int SMARTSELECT_END = 40; 190e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki private static final TextClassifier FAKE_TEXT_CLASSIFIER = new TextClassifier() { 191e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki @Override 192ca860dfb4a56aae4871151bec87ebf7c8c21b054Abodunrinwa Toki public TextSelection suggestSelection(TextSelection.Request request) { 193e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki return new TextSelection.Builder(SMARTSELECT_START, SMARTSELECT_END).build(); 194e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki } 195e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki }; 19609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private static final int CLICK_TIMEOUT = ViewConfiguration.getDoubleTapTimeout() + 50; 19709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 19822d40a1fcc078329a7e5a34ff5eeadeca9c70d49Kenny Root private CharSequence mTransformedText; 199354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov private Handler mHandler = new Handler(Looper.getMainLooper()); 200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 201a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Rule 202a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public ActivityTestRule<TextViewCtsActivity> mActivityRule = 203a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov new ActivityTestRule<>(TextViewCtsActivity.class); 204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 205a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Before 206a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov public void setup() { 207a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation = InstrumentationRegistry.getInstrumentation(); 208a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mActivity = mActivityRule.getActivity(); 209b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mActivity::hasWindowFocus); 210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 21228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook /** 2136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Promotes the TextView to editable and places focus in it to allow simulated typing. Used in 214a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov * test methods annotated with {@link UiThreadTest}. 21528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook */ 21628715a6877392e4e63cb2b0170c1592fb50079dcJames Cook private void initTextViewForTyping() { 2176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 2196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 2206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 221ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // Disable smart selection 222ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 2236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu } 2246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 2256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu /** 2266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * Used in test methods that can not entirely be run on the UiThread (e.g: tests that need to 2276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu * emulate touches and/or key presses). 2286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu */ 2294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void initTextViewForTypingOnUiThread() throws Throwable { 2304b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(this::initTextViewForTyping); 23128715a6877392e4e63cb2b0170c1592fb50079dcJames Cook mInstrumentation.waitForIdleSync(); 23228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 23328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 234047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @UiThreadTest 235a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 236047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOnUiThread() { 237047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 238047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 240047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu @Test 241047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu public void testConstructorOffUiThread() { 242047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu verifyConstructor(); 243047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu } 244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 245047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu private void verifyConstructor() { 246047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity); 247047c430fa4b8c5dfb7735fe32b8a3d5abf8bbbafAndrei Stingaceanu new TextView(mActivity, null); 248938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, android.R.attr.textViewStyle); 249f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_TextView); 250f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_DeviceDefault_Light_TextView); 251f0b8eb2d36b704834dd594c9eebe7f7134a94b40Kirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_TextView); 252938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov new TextView(mActivity, null, 0, android.R.style.Widget_Material_Light_TextView); 253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 256a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessText() { 258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String expected = mActivity.getResources().getString(R.string.text_view_hello); 261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(expected); 262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, tv.getText().toString()); 263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null); 265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 269a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetLineHeight() { 271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLineSpacing(1.2f, 1.5f); 275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineHeight() > 0); 276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 278a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLayout() throws Throwable { 2809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 2816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 2826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER); 283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TestLayoutRunnable runnable = new TestLayoutRunnable(mTextView) { 288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the text of TextView. 290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Hello, Android!"); 291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveLayout(); 292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 2949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(runnable.getLayout()); 297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 300a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3014b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessKeyListener() throws Throwable { 3029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getKeyListener()); 306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final KeyListener digitsKeyListener = DigitsKeyListener.getInstance(); 308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(digitsKeyListener)); 310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(digitsKeyListener, mTextView.getKeyListener()); 312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 3159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setKeyListener(qwertyKeyListener)); 316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(qwertyKeyListener, mTextView.getKeyListener()); 318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 320a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMovementMethod() throws Throwable { 322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence LONG_TEXT = "Scrolls the specified widget to the specified " 323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "coordinates, except constrains the X scrolling position to the horizontal " 324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "regions of the text that will be visible after scrolling to " 325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + "the specified Y position."; 326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionStart = 10; 327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int selectionEnd = LONG_TEXT.length(); 328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final MovementMethod movementMethod = ArrowKeyMovementMethod.getInstance(); 3299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 3316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(movementMethod); 3326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(LONG_TEXT, BufferType.EDITABLE); 3336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(movementMethod, mTextView.getMovementMethod()); 340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 342b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 343b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection has been removed. 345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionEnd(mTextView.getText())); 347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 3496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setMovementMethod(null); 3506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Editable) mTextView.getText(), 3516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu selectionStart, selectionEnd); 3526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 359b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_SHIFT_LEFT, 360b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.KEYCODE_DPAD_UP); 361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the selection will not be changed. 362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, Selection.getSelectionStart(mTextView.getText())); 363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, Selection.getSelectionEnd(mTextView.getText())); 364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 367a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testLength() { 369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is content"; 372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content); 373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.length()); 374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(""); 376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.length()); 380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 383a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessGravity() { 385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_gravity); 386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_default); 3884bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_bottom); 3914bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.BOTTOM | Gravity.START, mTextView.getGravity()); 392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_right); 394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center); 397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_fill); 400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.gravity_center_vertical_right); 403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER_VERTICAL | Gravity.RIGHT, mTextView.getGravity()); 404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); 406fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, mTextView.getGravity()); 407fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL); 408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.FILL, mTextView.getGravity()); 409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER); 410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.CENTER, mTextView.getGravity()); 411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.NO_GRAVITY); 4134bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.TOP | Gravity.START, mTextView.getGravity()); 414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Gravity.TOP | Gravity.RIGHT, mTextView.getGravity()); 417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.FILL_VERTICAL); 4194bb7d555a927c5f7a8747fdd85f7c94e1c0d2f19Fabrice Di Meglio assertEquals(Gravity.FILL_VERTICAL | Gravity.START, mTextView.getGravity()); 420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //test negative input value. 422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(-1); 423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getGravity()); 424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 426ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 427ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef({EditorInfo.IME_ACTION_UNSPECIFIED, EditorInfo.IME_ACTION_NONE, 428ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH, EditorInfo.IME_ACTION_SEND, 429ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, EditorInfo.IME_ACTION_DONE, EditorInfo.IME_ACTION_PREVIOUS}) 430ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionAction {} 431ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 432ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Retention(SOURCE) 433ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @IntDef(flag = true, 434ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa value = {EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING, 435ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN, EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS, 436ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT, EditorInfo.IME_FLAG_NO_EXTRACT_UI, 437ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION, EditorInfo.IME_FLAG_NO_ENTER_ACTION, 438ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII}) 439ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private @interface ImeOptionFlags {} 440ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 441ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa private static void assertImeOptions(TextView textView, 442ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionAction int expectedImeOptionAction, 443ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @ImeOptionFlags int expectedImeOptionFlags) { 444ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualAction = textView.getImeOptions() & EditorInfo.IME_MASK_ACTION; 445ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa final int actualFlags = textView.getImeOptions() & ~EditorInfo.IME_MASK_ACTION; 446ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionAction, actualAction); 447ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(expectedImeOptionFlags, actualFlags); 448ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 449ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 450ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @UiThreadTest 451ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa @Test 452ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa public void testImeOptions() { 453ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.setContentView(R.layout.textview_imeoptions); 454ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 455ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test "normal" to be a synonym EditorInfo.IME_NULL 456ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertEquals(EditorInfo.IME_NULL, 457ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.<TextView>findViewById(R.id.textview_imeoption_normal).getImeOptions()); 458ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 459ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_ACTION_* 460ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 461ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_unspecified), 462ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 0); 463ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 464ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_none), 465ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NONE, 0); 466ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 467ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_go), 468ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 0); 469ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 470ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_search), 471ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEARCH, 0); 472ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 473ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_send), 474ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_SEND, 0); 475ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 476ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_next), 477ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_NEXT, 0); 478ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 479ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_done), 480ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_DONE, 0); 481ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 482ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_action_previous), 483ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_PREVIOUS, 0); 484ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 485ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // Test EditorInfo.IME_FLAG_* 486ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 487ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_personalized_learning), 488ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 489ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING); 490ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 491ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_fullscreen), 492ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 493ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_FULLSCREEN); 494ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 495ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_previous), 496ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 497ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS); 498ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 499ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_navigation_next), 500ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 501ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT); 502ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 503ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_extract_ui), 504ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 505ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_EXTRACT_UI); 506ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 507ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_accessory_action), 508ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 509ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ACCESSORY_ACTION); 510ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 511ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_no_enter_action), 512ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 513ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NO_ENTER_ACTION); 514ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 515ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById(R.id.textview_imeoption_force_ascii), 516ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_UNSPECIFIED, 517ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_FORCE_ASCII); 518ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 519ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa // test action + multiple flags 520ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa assertImeOptions( 521ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa mActivity.findViewById( 522ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa R.id.textview_imeoption_action_go_nagivate_next_no_extract_ui_force_ascii), 523ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_ACTION_GO, 524ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa EditorInfo.IME_FLAG_NAVIGATE_NEXT | EditorInfo.IME_FLAG_NO_EXTRACT_UI 525ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa | EditorInfo.IME_FLAG_FORCE_ASCII); 526ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa } 527ba58de69c056f0886d7a1a27d8ed579dda83a0b8Yohei Yukawa 528a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessAutoLinkMask() throws Throwable { 530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text1 = 532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("URL: http://www.google.com. mailto: account@gmail.com"); 5339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.ALL); 5356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text1, BufferType.EDITABLE); 536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, mTextView.getAutoLinkMask()); 539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Spannable spanString = (Spannable) mTextView.getText(); 541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("http://www.google.com", spans[0].getURL()); 545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("mailto:account@gmail.com", spans[1].getURL()); 546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text2 = 548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new SpannableString("name: Jack. tel: +41 44 800 8999"); 5499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 5506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 5516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text2, BufferType.EDITABLE); 552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, mTextView.getAutoLinkMask()); 555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spanString = (Spannable) mTextView.getText(); 557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = spanString.getSpans(0, spanString.length(), URLSpan.class); 558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(spans); 559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("tel:+41448008999", spans[0].getURL()); 561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_autolink); 563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1 for web, 2 for email, 4 for phone, 7 for all(web|email|phone) 564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, getAutoLinkMask(R.id.autolink_default)); 565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS, getAutoLinkMask(R.id.autolink_web)); 566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES, getAutoLinkMask(R.id.autolink_email)); 567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS, getAutoLinkMask(R.id.autolink_phone)); 568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.ALL, getAutoLinkMask(R.id.autolink_all)); 569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES, 570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound1)); 571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.WEB_URLS | Linkify.PHONE_NUMBERS, 572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound2)); 573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS, 574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound3)); 575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Linkify.PHONE_NUMBERS | Linkify.ALL, 576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su getAutoLinkMask(R.id.autolink_compound4)); 577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 5799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 580a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextSize() { 582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20f); 586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, metrics), 587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20f); 590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20f, metrics), 591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextSize by default unit "sp" 598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(20f); 599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20f, metrics), 600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextSize(200f); 603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 200f, metrics), 604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTextSize(), 0.01f); 605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 608a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessTextColor() { 610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.GREEN); 613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentTextColor()); 614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getTextColors()); 615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.BLACK); 617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLACK), mTextView.getTextColors()); 619fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(Color.RED); 621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentTextColor()); 622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getTextColors()); 623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(colors); 630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getTextColors()); 631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentTextColor()); 632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextColor(null); 636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should thrown exception if the colors is null"); 637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e){ 638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 641a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 642325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette public void testGetTextColor() { 643325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette // TODO: How to get a suitable TypedArray to test this method. 644325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 645325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette try { 646325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette TextView.getTextColor(mActivity, null, -1); 647325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette fail("There should be a NullPointerException thrown out."); 648325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } catch (NullPointerException e) { 649325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 650325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette } 651325d45563875cb6915e40070f3f687a3d92566f2Alan Viverette 652a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6534b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessHighlightColor() throws Throwable { 654354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 655354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 657354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setTextIsSelectable(true); 658354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setText("abcd", BufferType.EDITABLE); 659354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov textView.setHighlightColor(Color.BLUE); 660354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov }); 661354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 662354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 663354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(textView.isTextSelectable()); 664354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.BLUE, textView.getHighlightColor()); 665354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 666354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Long click on the text selects all text and shows selection handlers. The view has an 667354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // attribute layout_width="wrap_content", so clicked location (the center of the view) 668354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // should be on the text. 6699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, textView); 670fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 671354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // At this point the entire content of our TextView should be selected and highlighted 672354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // with blue. Now change the highlight to red while the selection is still on. 6739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.RED)); 674354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 675354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 676354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.RED, textView.getHighlightColor()); 677354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 678354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 679354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Remove the selection 6809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) textView.getText())); 681354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 682354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 683354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // And switch highlight to green after the selection has been removed 6849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setHighlightColor(Color.GREEN)); 685354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 686354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 687354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals(Color.GREEN, textView.getHighlightColor()); 688354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", textView.getText())); 689fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 690fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 6919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 692a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 693fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetShadowLayer() { 6946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test values 6956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final MockTextView mockTextView = new MockTextView(mActivity); 6966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 6976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.4f, Color.CYAN); 6986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(Color.CYAN, mockTextView.getShadowColor()); 699a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.3f, mockTextView.getShadowDx(), 0.0f); 700a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.4f, mockTextView.getShadowDy(), 0.0f); 701a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mockTextView.getShadowRadius(), 0.0f); 702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the left and below the text 7046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, 0.3f, 0.3f, Color.CYAN); 7056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 7066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 7076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getRightPaddingOffset()); 7096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(1, mockTextView.getBottomPaddingOffset()); 710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 711fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // shadow is placed to the right and above the text 7126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(1.0f, -0.8f, -0.8f, Color.CYAN); 7136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(mockTextView.isPaddingOffsetRequired()); 7146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getLeftPaddingOffset()); 7156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mockTextView.getTopPaddingOffset()); 7166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 718fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // no shadow 7206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.setShadowLayer(0.0f, 0.0f, 0.0f, Color.CYAN); 7216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(mockTextView.isPaddingOffsetRequired()); 7226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getLeftPaddingOffset()); 7236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getTopPaddingOffset()); 7246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getRightPaddingOffset()); 7256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(0, mockTextView.getBottomPaddingOffset()); 726fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 727fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 728fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 729a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 730fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSelectAllOnFocus() { 731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_selectallonfocus); 732fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String content = "This is the content"; 733fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String blank = ""; 734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.selectAllOnFocus_default); 735fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 736fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 737fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(content, BufferType.SPANNABLE); 746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 749fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 750fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 751fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(content.length(), mTextView.getSelectionEnd()); 755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(blank, BufferType.SPANNABLE); 768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(true); 769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(blank.length(), mTextView.getSelectionEnd()); 777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 0); 779fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSelectAllOnFocus(false); 780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change the focus 781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su findTextView(R.id.selectAllOnFocus_dummy).requestFocus(); 782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.isFocused()); 783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestFocus(); 784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.isFocused()); 785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionEnd()); 788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 7909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 791a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetPaint() { 793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextPaint tp = mTextView.getPaint(); 795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(tp); 796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 797fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaintFlags(), tp.getFlags()); 798fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 799fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 801a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinksClickable() { 803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_true); 809fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 810fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 811fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.linksClickable_false); 812fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(false); 815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getLinksClickable()); 816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinksClickable(true); 818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLinksClickable()); 819fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getMovementMethod()); 821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = new SpannableString("name: Jack. tel: +41 44 800 8999"); 823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setAutoLinkMask(Linkify.PHONE_NUMBERS); 825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Movement method will be automatically set to LinkMovementMethod 828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getMovementMethod() instanceof LinkMovementMethod); 829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 832a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHintTextColor() { 834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using int values 836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.GREEN); 838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GREEN, mTextView.getCurrentHintTextColor()); 839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GREEN), mTextView.getHintTextColors()); 840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.BLUE); 842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.BLUE), mTextView.getHintTextColors()); 843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLUE, mTextView.getCurrentHintTextColor()); 844fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(Color.RED); 846fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.RED), mTextView.getHintTextColors()); 847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.RED, mTextView.getCurrentHintTextColor()); 848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using ColorStateList 850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_focused}, new int[0] }, 853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(colors); 855fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getHintTextColors()); 856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getCurrentHintTextColor()); 857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // exceptional 859fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHintTextColor(null); 860fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHintTextColors()); 861fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCurrentTextColor(), mTextView.getCurrentHintTextColor()); 862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 865a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessLinkTextColor() { 867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.GRAY); 870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.GRAY), mTextView.getLinkTextColors()); 871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.GRAY, mTextView.getPaint().linkColor); 872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.YELLOW); 874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.YELLOW), mTextView.getLinkTextColors()); 875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.YELLOW, mTextView.getPaint().linkColor); 876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(Color.WHITE); 878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(ColorStateList.valueOf(Color.WHITE), mTextView.getLinkTextColors()); 879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.WHITE, mTextView.getPaint().linkColor); 880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ColorStateList colors = new ColorStateList(new int[][] { 882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { android.R.attr.state_expanded}, new int[0] }, 883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new int[] { Color.rgb(0, 255, 0), Color.BLACK }); 884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(colors); 885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(colors, mTextView.getLinkTextColors()); 886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLinkTextColor(null); 889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLinkTextColors()); 890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Color.BLACK, mTextView.getPaint().linkColor); 891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 894a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessPaintFlags() { 896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 89753959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG 89853959f211c113aa7b2a2ebaf80e10b79ddcccef1Victoria Lease | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags()); 899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG); 901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG, 902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG); 905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Paint.STRIKE_THRU_TEXT_FLAG | Paint.LINEAR_TEXT_FLAG, 906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getPaintFlags()); 907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 909a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 9104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testHeight() throws Throwable { 911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 9126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalHeight = mTextView.getHeight(); 913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMaxHeight 9156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newHeight = originalHeight + 1; 9166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 9226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = Integer.MAX_VALUE; 9316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxHeight(newHeight); 932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setMinHeight 9366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9376a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 9386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinHeight(newHeight); 948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // reset min and max height 952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinHeight(0); 953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxHeight(Integer.MAX_VALUE); 954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // test setHeight 9566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight + 1; 9576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9616a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = originalHeight - 1; 9636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 9646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getHeight()); 9656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 9676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newHeight = -1; 9696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setHeight(newHeight); 970fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getHeight()); 9716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMaxHeight()); 9726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newHeight, mTextView.getMinHeight()); 973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 974fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHeight(originalHeight); 975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalHeight, mTextView.getHeight()); 9766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMaxHeight()); 9776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(originalHeight, mTextView.getMinHeight()); 978fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 9796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting max/min lines should cause getMaxHeight/getMinHeight to return -1 9806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxLines(2); 9816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting maxLines should return -1 fir maxHeight", 9826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMaxHeight()); 9836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 9846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinLines(1); 9856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting minLines should return -1 for minHeight", 9866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir -1, mTextView.getMinHeight()); 9876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 9886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 989a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 990673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir public void testSetMaxLines_toZero_shouldNotDisplayAnyLines() throws Throwable { 991673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mTextView = findTextView(R.id.textview_text); 992673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mActivityRule.runOnUiThread(() -> { 993673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mTextView.setPadding(0, 0, 0, 0); 994673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mTextView.setText("Single"); 995673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mTextView.setMaxLines(0); 996673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir }); 997673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mInstrumentation.waitForIdleSync(); 998673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir 999673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir final int expectedHeight = mTextView.getTotalPaddingBottom() 1000673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir + mTextView.getTotalPaddingTop(); 1001673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir 1002673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir assertEquals(expectedHeight, mTextView.getHeight()); 1003673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir 1004673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mActivityRule.runOnUiThread(() -> mTextView.setText("Two\nLines")); 1005673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mInstrumentation.waitForIdleSync(); 1006673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir assertEquals(expectedHeight, mTextView.getHeight()); 1007673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir 1008673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mActivityRule.runOnUiThread(() -> mTextView.setTextIsSelectable(true)); 1009673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir mInstrumentation.waitForIdleSync(); 1010673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir assertEquals(expectedHeight, mTextView.getHeight()); 1011673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir } 1012673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir 1013673d0feb3f3c39957778684bdb243c18b5455bb6Siyamed Sinir @Test 10144b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testWidth() throws Throwable { 10156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = findTextView(R.id.textview_text); 10166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int originalWidth = mTextView.getWidth(); 10176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir int newWidth = mTextView.getWidth() / 8; 10196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 10206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Min Width 10256a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 10266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(newWidth); 1027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 1032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinWidth(originalWidth - 1); 10339c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10346a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1036fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1037fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Width 10386a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth + 1; 10396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 1040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 1044fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 10456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir newWidth = originalWidth - 1; 10466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setWidth(newWidth); 10479c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu assertEquals(2, mTextView.getLineCount()); 10486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getWidth()); 10496a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMaxWidth()); 10506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(newWidth, mTextView.getMinWidth()); 10516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // setting ems should cause getMaxWidth/getMinWidth to return -1 10536a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setEms(1); 10546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMaxWidth()); 10556a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Setting ems should return -1 for maxWidth", -1, mTextView.getMinWidth()); 1056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1057fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1058a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10594b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMinEms() throws Throwable { 1060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1061fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10629c3b459233e30a88d24e7178cc7514731fa56f55Brian Muramatsu 10636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1066fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms + 1); 1067fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 106898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 106998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 1070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinEms(originalEms - 1); 1072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 107398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 107498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 10756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMinWidth(1); 10776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMinEms()); 1078fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1079fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1080a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 10814b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetMaxEms() throws Throwable { 1082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1083fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 10846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 10856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 10866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1087fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1088fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms + 1); 1089fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 1090fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(originalWidth, mTextView.getWidth()); 109198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 109298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1093fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1094fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxEms(originalEms - 1); 1095fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 10966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 109798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 109898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 10996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 11006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir setMaxWidth(originalWidth); 11016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(-1, mTextView.getMaxEms()); 1102fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1103fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1104a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11054b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetEms() throws Throwable { 1106fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1107fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("check height", 1, mTextView.getLineCount()); 11086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalWidth = mTextView.getWidth(); 11096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int originalEms = originalWidth / mTextView.getLineHeight(); 1110fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1111fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms + 1); 1112fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 11136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms + 1) * mTextView.getLineHeight(), mTextView.getWidth()); 111498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 111598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 111698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMinEms()); 111798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms + 1, mTextView.getMaxEms()); 1118fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1119fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setEms(originalEms - 1); 1120fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((1 < mTextView.getLineCount())); 11216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals((originalEms - 1) * mTextView.getLineHeight(), mTextView.getWidth()); 112298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinWidth()); 112398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxWidth()); 112498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMinEms()); 112598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalEms - 1, mTextView.getMaxEms()); 1126fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1127fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1128a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11294b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLineSpacing() throws Throwable { 11309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 11319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 1132fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLineHeight = mTextView.getLineHeight(); 1133fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1134fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // normal 1135fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float add = 1.2f; 1136fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su float mult = 1.4f; 1137fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 113892e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1139fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 0.0f; 1140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 114292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1143fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1144fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // abnormal 1145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 1.4f; 1147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 114892e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = -1.2f; 1150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = -1.4f; 1151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 115292e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = 1.2f; 1154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = 0.0f; 1155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 115692e24e51c89759b176c38a0ceaa94ae7b23c1930Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1158fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // edge 1159fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MIN_VALUE; 1160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MIN_VALUE; 1161fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1162ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(Math.round(originalLineHeight * mult + add), mTextView.getLineHeight()); 1163ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette 1164ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // edge case where the behavior of Math.round() deviates from 1165ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette // FastMath.round(), requiring us to use an explicit 0 value 1166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su add = Float.MAX_VALUE; 1167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mult = Float.MAX_VALUE; 1168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLineSpacing(add, mult); 1169ae663de2120beb9de33d57e2c0ebfa6662e1d9f8Alan Viverette assertEquals(0, mTextView.getLineHeight()); 1170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1172a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 11734b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetElegantLineHeight() throws Throwable { 1174ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mTextView = findTextView(R.id.textview_text); 1175ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 11769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 11776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 11786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 11796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 1180ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien }); 1181ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1182ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1183ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien int oldHeight = mTextView.getHeight(); 11849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(true)); 1185ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1186ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1187ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getPaint().isElegantTextHeight()); 1188ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() > oldHeight); 1189ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 11909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setElegantTextHeight(false)); 1191ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien mInstrumentation.waitForIdleSync(); 1192ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getPaint().isElegantTextHeight()); 1193ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getHeight() == oldHeight); 1194ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien } 1195ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien 1196a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessFreezesText() throws Throwable { 1198fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(R.layout.textview_hint_linksclickable_freezestext); 1199fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 1201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_true); 1204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(false); 1210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getFreezesText()); 1211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final CharSequence text = "Hello, TextView."; 12139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 1215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final URLSpan urlSpan = new URLSpan("ctstest://TextView/test"); 121772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1218a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov ActivityMonitor am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 12226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 12236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 12246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Activity newActivity = am.waitForActivityWithTimeout(TIMEOUT); 1228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(newActivity); 1229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1230a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is removed. 1232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 123372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 123472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(text.toString(), mTextView.getText().toString()); 1235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFreezesText(true); 1237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getFreezesText()); 1238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 1240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 124172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // TODO: How to simulate the TextView in frozen icicles. 1242a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov am = mInstrumentation.addMonitor(MockURLSpanTestActivity.class.getName(), 1243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su null, false); 1244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 12466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Uri uri = Uri.parse(urlSpan.getURL()); 12476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Intent intent = new Intent(Intent.ACTION_VIEW, uri); 12486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.startActivity(intent); 1249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 1250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 125107b9d3406e116f2f6b92932925783eed79503de0Mist Liao Activity oldActivity = newActivity; 125207b9d3406e116f2f6b92932925783eed79503de0Mist Liao while (true) { 125307b9d3406e116f2f6b92932925783eed79503de0Mist Liao newActivity = am.waitForActivityWithTimeout(TIMEOUT); 125407b9d3406e116f2f6b92932925783eed79503de0Mist Liao assertNotNull(newActivity); 125507b9d3406e116f2f6b92932925783eed79503de0Mist Liao if (newActivity != oldActivity) { 125607b9d3406e116f2f6b92932925783eed79503de0Mist Liao break; 125707b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 125807b9d3406e116f2f6b92932925783eed79503de0Mist Liao } 1259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su newActivity.finish(); 1260a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.removeMonitor(am); 1261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text of TextView is still there. 1262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.freezesText_false); 1263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.toString(), mTextView.getText().toString()); 1264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 12669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1267a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetEditableFactory() { 1269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 127298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Editable.Factory mockEditableFactory = spy(new Editable.Factory()); 127398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockEditableFactory).newEditable(any(CharSequence.class)); 127498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setEditableFactory(mockEditableFactory); 127598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 127798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 127998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 128198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 128598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, never()).newEditable(any(CharSequence.class)); 1286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 128798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 128998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setKeyListener(DigitsKeyListener.getInstance()); 129298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockEditableFactory); 1293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 129498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockEditableFactory, times(1)).newEditable(text); 1295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEditableFactory(null); 1298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1304a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetSpannableFactory() { 1306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "sample"; 1308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 130998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final Spannable.Factory mockSpannableFactory = spy(new Spannable.Factory()); 131098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov doCallRealMethod().when(mockSpannableFactory).newSpannable(any(CharSequence.class)); 131198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setSpannableFactory(mockSpannableFactory); 131298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov 1313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text); 131498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 131698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.EDITABLE); 131898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 132098d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 132298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, never()).newSpannable(any(CharSequence.class)); 1323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 132498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 132698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 132998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockSpannableFactory); 1330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.NORMAL); 133198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockSpannableFactory, times(1)).newSpannable(text); 1332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setSpannableFactory(null); 1335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("The factory can not set to null!"); 1336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 1337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 13409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1341a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextChangedListener() { 1343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher0 = new MockTextWatcher(); 1345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextWatcher watcher1 = new MockTextWatcher(); 1346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher0); 1348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.addTextChangedListener(watcher1); 1349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called though the strings are same 1363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("Changed"); 1364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1367fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1368fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // BeforeTextChanged and OnTextChanged are called twice (The text is not 1374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Editable, so in Append() it calls setText() first) 1375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("and appended"); 1376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledBeforeTextChanged()); 1380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledOnTextChanged()); 1381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher1.hasCalledAfterTextChanged()); 1382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1385fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Methods are not called if the string does not change 1386fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(""); 1387fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledBeforeTextChanged()); 1388fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledOnTextChanged()); 1389fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher0.hasCalledAfterTextChanged()); 1390fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1391fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1392fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1393fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1394fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher0.reset(); 1395fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su watcher1.reset(); 1396fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.removeTextChangedListener(watcher1); 1397fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(null); 1398fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledBeforeTextChanged()); 1399fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledOnTextChanged()); 1400fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(watcher0.hasCalledAfterTextChanged()); 1401fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledBeforeTextChanged()); 1402fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledOnTextChanged()); 1403fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(watcher1.hasCalledAfterTextChanged()); 1404fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1405fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 14069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 1407a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1408fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetTextKeepState1() { 1409fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 1410fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1411fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1412fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1413fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1414fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1415fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1416fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1417fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1418fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1419fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1420fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1421fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1422fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1423fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1424fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), shortString.length() + 1); 1425fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1426fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1427fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1428fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1429fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1430fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1431fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1432fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, 4); 1433fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1434fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1435fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1436fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getSelectionEnd()); 1437fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1438fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1439fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1440fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, shortString.length() + 1); 1441fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1442fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1443fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1444fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1445fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1446fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1447fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1448fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1449fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1450fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString); 1451fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1452fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1453fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1454fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1455fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1456fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1457a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1458fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetEditableText() { 1459fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1460fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1461fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "Hello"; 1462fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.EDITABLE); 1463fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1464fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1465fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getEditableText().toString()); 1466fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1467fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(text, BufferType.SPANNABLE); 1468fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text, tv.getText().toString()); 1469fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1470fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1471fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1472fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.EDITABLE); 1473fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1474fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 1475fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getEditableText().toString()); 1476fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1477fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(null, BufferType.SPANNABLE); 1478fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1479fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 1480fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(tv.getEditableText()); 1481fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1482fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1483fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1484a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1485fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText2() { 1486fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = "This is a test for setting text content by char array"; 1487fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su char[] input = string.toCharArray(); 1488fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1489fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1490fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, input.length); 1491fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string, tv.getText().toString()); 1492fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1493fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, 5); 1494fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(string.substring(0, 5), tv.getText().toString()); 1495fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1496fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1497fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, -1, input.length); 1498fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the start position is negative!"); 1499fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1500fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1501fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1502fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1503fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 0, -1); 1504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the length is negative!"); 1505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, input.length); 1510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if the end position is out of index!"); 1511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IndexOutOfBoundsException exception) { 1512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(input, 1, 0); 1515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", tv.getText().toString()); 1516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1519a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText1() { 1521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 1522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String longString = "very long content"; 1524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String shortString = "short"; 1525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1526fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is inside the short string 1527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString, BufferType.SPANNABLE); 1528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 3); 1529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionStart()); 1534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(3, mTextView.getSelectionEnd()); 1535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(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 // there is no selection. 1541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // selection is at the exact place which is outside the short string 1545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), longString.length()); 1547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(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 // there is no selection. 1559fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1560fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is inside the short string 1563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1564fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1, shortString.length() - 1); 1565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1566fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getSelectionStart()); 1570fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length() - 1, mTextView.getSelectionEnd()); 1571fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1576fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1580fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which ends outside the short string 1581fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1582fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 2, longString.length()); 1583fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1584fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getSelectionStart()); 1588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1590fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1594fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1596fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1597fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1598fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // select the sub string which is outside the short string 1599fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(longString); 1600fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), 1601fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su shortString.length() + 1, shortString.length() + 3); 1602fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextKeepState(shortString, BufferType.EDITABLE); 1603fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1604fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionStart()); 1607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString.length(), mTextView.getSelectionEnd()); 1608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(shortString, BufferType.EDITABLE); 1610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 1611fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getText().toString()); 1612fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(shortString, mTextView.getEditableText().toString()); 1613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no selection. 1614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionStart()); 1615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getSelectionEnd()); 1616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1618fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 1619a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1620fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText3() { 1621fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 1622fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1623fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 1624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 1625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId); 1627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 1628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 1629fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 1630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1); 1631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 1632fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 1633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 1635fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 16363a29f628d13959c3e3f75a3fd1224262be296880Seigo Nonaka @UiThreadTest 16373a29f628d13959c3e3f75a3fd1224262be296880Seigo Nonaka @Test 163882d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka public void testSetText_PrecomputedText() { 16393a29f628d13959c3e3f75a3fd1224262be296880Seigo Nonaka final TextView tv = findTextView(R.id.textview_text); 164082d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka final PrecomputedText measured = PrecomputedText.create( 164182d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka "This is an example text.", tv.getTextMetricsParams()); 164206658d9196b28a7a82f07a9c6cb883110043b9f3Seigo Nonaka tv.setText(measured); 164306658d9196b28a7a82f07a9c6cb883110043b9f3Seigo Nonaka assertEquals(measured.toString(), tv.getText().toString()); 16443a29f628d13959c3e3f75a3fd1224262be296880Seigo Nonaka } 16453a29f628d13959c3e3f75a3fd1224262be296880Seigo Nonaka 1646a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetTextUpdatesHeightAfterRemovingImageSpan() throws Throwable { 164898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // Height calculation had problems when TextView had width: match_parent 164998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int textViewWidth = ViewGroup.LayoutParams.MATCH_PARENT; 165098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final Spannable text = new SpannableString("some text"); 165198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final int spanHeight = 100; 165298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 165398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // prepare TextView, width: MATCH_PARENT 16549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 16559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 16569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 16579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 2); 16589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setPadding(0, 0, 0, 0); 16599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setIncludeFontPadding(false); 16609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 166198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 166298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(textViewWidth, 166398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 16649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 166598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir layout.setLayoutParams(layoutParams); 16669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 1667a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 166898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 166998d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height of text with no span 16709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithoutSpan = mTextView.getHeight(); 167198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be smaller than span height", 167298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan < spanHeight); 167398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 167498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // add ImageSpan to text 167598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir Drawable drawable = mInstrumentation.getContext().getDrawable(R.drawable.scenery); 167698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir drawable.setBounds(0, 0, spanHeight, spanHeight); 167798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir ImageSpan span = new ImageSpan(drawable); 167898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 16799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 168098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 168198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 168298d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // measure height with span 16839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightWithSpan = mTextView.getHeight(); 168498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertTrue("Text height should be greater or equal than span height", 168598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithSpan >= spanHeight); 168698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 168798d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir // remove the span 168898d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir text.removeSpan(span); 16899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setText(text)); 169098d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir mInstrumentation.waitForIdleSync(); 169198d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 16929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int heightAfterRemoveSpan = mTextView.getHeight(); 169398d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir assertEquals("Text height should be same after removing the span", 169498d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir heightWithoutSpan, heightAfterRemoveSpan); 169598d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir } 169698d94f2d9f2354dc151fe0ad12646c39b7cf49b8Siyamed Sinir 1697a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 16984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRemoveSelectionWithSelectionHandles() throws Throwable { 16996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1700af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1701354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isTextSelectable()); 17029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 1703354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setTextIsSelectable(true); 1704354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mTextView.setText("abcd", BufferType.EDITABLE); 1705af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi }); 1706af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1707354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isTextSelectable()); 1708af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1709af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // Long click on the text selects all text and shows selection handlers. The view has an 1710af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // attribute layout_width="wrap_content", so clicked location (the center of the view) 1711af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi // should be on the text. 17129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 1713af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 17149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> Selection.removeSelection((Spannable) mTextView.getText())); 1715af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi mInstrumentation.waitForIdleSync(); 1716354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 1717354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.equals("abcd", mTextView.getText())); 1718af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi } 1719af32bc382e1eae93a12b5c2aa91c2acf8a999adfYoshiki Iguchi 1720a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 17214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_insert() throws Throwable { 17226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 17235b51f77b99861d48fec1c327252416f726b3b01aJames Cook 17245b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text. 1725b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 17269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 17276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The cursor is at the end of the text. 17286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the typed string in one step. 17316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo restores the text and cursor position. 17366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 17376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 17386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo clears the text again. 17416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo when the undo stack is empty does nothing. 17456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17475b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17485b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 174928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17505b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1751a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 17524b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_delete() throws Throwable { 17536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 17545b51f77b99861d48fec1c327252416f726b3b01aJames Cook 175528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Simulate deleting text and undoing it. 1756b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1757b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1758b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 17599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 17606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Precondition: The text was actually deleted. 17616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo restores the typed string and cursor position in one step. 17656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Redo removes the text in one step. 17706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 17716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing the redo restores the text again. 17756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("xyz", mTextView.getText().toString()); 17776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(3, mTextView.getSelectionStart()); 17786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 17796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undoing again undoes the original typing. 17806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 17816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 17826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(0, mTextView.getSelectionStart()); 17835b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 17845b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 178528715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 17865b51f77b99861d48fec1c327252416f726b3b01aJames Cook 1787c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Initialize the text view for simulated IME typing. Must be called on UI thread. 1788c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private InputConnection initTextViewForSimulatedIme() { 1789c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView = findTextView(R.id.textview_text); 179018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return initTextViewForSimulatedIme(mTextView); 179118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 179218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 179318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir private InputConnection initTextViewForSimulatedIme(TextView textView) { 179418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 179518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir textView.setText("", BufferType.EDITABLE); 179618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir return textView.onCreateInputConnection(new EditorInfo()); 1797c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1798c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1799c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulates IME composing text behavior. 1800c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook private void setComposingTextInBatch(InputConnection input, CharSequence text) { 1801c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1802c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText(text, 1); // Leave cursor at end. 1803c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1804c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1805c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1806c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1807a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1808c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertLatin() { 1809c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1810c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1811c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Simulate IME text entry behavior. The Latin IME enters text by replacing partial words, 1812c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // such as "c" -> "ca" -> "cat" -> "cat ". 1813c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "c"); 1814c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "ca"); 1815c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1816c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The completion and space are added in the same batch. 1817c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1818c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("cat", 1); 1819c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText(" ", 1); 1820c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1821c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1822c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements undo in a single step. 1823c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1824c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1825c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1826c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1827c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1828a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1829c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeInsertJapanese() { 1830c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1831c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1832c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The Japanese IME does repeated replacements of Latin characters to hiragana to kanji. 1833c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1834c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String NA = "\u306A"; // HIRAGANA LETTER NA 1835c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1836c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1837c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1838c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + NA); 1839c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1840c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The result may be a surrogate pair. The composition ends in the same batch. 1841c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1842c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.commitText("\uD83C\uDF37", 1); // U+1F337 TULIP 1843c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.setComposingText("", 1); 1844c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1845c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1846c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // The repeated replacements are a single undo step. 1847c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1848c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("", mTextView.getText().toString()); 1849c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1850c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1851c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1852a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 185371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeInsertAndDeleteLatin() { 185471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi InputConnection input = initTextViewForSimulatedIme(); 185571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 185671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 185771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 185871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 185971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "test"); 186071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "tes"); 186171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 186271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 186371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 186471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 186571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.setComposingText("", 1); 186671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.finishComposingText(); 186771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 186871e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 186971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 187071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("test", mTextView.getText().toString()); 187171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi mTextView.onTextContextMenuItem(android.R.id.undo); 187271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals("", mTextView.getText().toString()); 187371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 187471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 187571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1876a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 187771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi public void testUndo_imeAutoCorrection() { 187818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 187918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 188018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 188171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 188271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Start typing a composition. 188371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "t"); 188471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "te"); 188571e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi setComposingTextInBatch(input, "teh"); 188671e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 188718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CorrectionInfo correctionInfo = new CorrectionInfo(0, "teh", "the"); 188818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 188971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.beginBatchEdit(); 189071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi // Auto correct "teh" to "the". 189118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCorrection(correctionInfo)); 189271e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.commitText("the", 1); 189371e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi input.endBatchEdit(); 189471e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 189518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCorrection(refEq(correctionInfo)); 189618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 189718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("the", spiedTextView.getText().toString()); 189818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 189918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("teh", spiedTextView.getText().toString()); 190018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 190118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 190218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir } 190318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 190418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir @UiThreadTest 1905a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 190618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir public void testUndo_imeAutoCompletion() { 190718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir mTextView = findTextView(R.id.textview_text); 190818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir TextView spiedTextView = spy(mTextView); 190918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir InputConnection input = initTextViewForSimulatedIme(spiedTextView); 191018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 191118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Start typing a composition. 191218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "a"); 191318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "an"); 191418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir setComposingTextInBatch(input, "and"); 191518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 191618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir CompletionInfo completionInfo = new CompletionInfo(0, 0, "android"); 191718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir reset(spiedTextView); 191818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.beginBatchEdit(); 191918731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir // Auto complete "and" to "android". 192018731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertTrue(input.commitCompletion(completionInfo)); 192118731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.commitText("android", 1); 192218731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir input.endBatchEdit(); 192318731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 192418731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir verify(spiedTextView, times(1)).onCommitCompletion(refEq(completionInfo)); 192518731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir 192618731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("android", spiedTextView.getText().toString()); 192718731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir spiedTextView.onTextContextMenuItem(android.R.id.undo); 192818731b8489073e46e594c798247e5b6338204c3eSiyamed Sinir assertEquals("", spiedTextView.getText().toString()); 192971e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi } 193071e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi 193171e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi @UiThreadTest 1932a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1933c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeCancel() { 1934c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1935c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1936c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1937c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Start typing a composition. 1938c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook final String HA = "\u306F"; // HIRAGANA LETTER HA 1939c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, "h"); 1940c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA); 1941c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, HA + "n"); 1942c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1943c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Cancel the composition. 1944c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook setComposingTextInBatch(input, ""); 1945c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1946c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 194771e696fcc640126a0360d30e8b1d9a5552f6dd1dKeisuke Kuroyanagi assertEquals(HA + "n" + "flower", mTextView.getText().toString()); 1948c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1949c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1950c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1951c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1952c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook @UiThreadTest 1953a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 1954c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook public void testUndo_imeEmptyBatch() { 1955c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook InputConnection input = initTextViewForSimulatedIme(); 1956c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.setText("flower"); 1957c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1958c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Send an empty batch edit. This happens if the IME is hidden and shown. 1959c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.beginBatchEdit(); 1960c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook input.endBatchEdit(); 1961c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1962c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Undo and redo do nothing. 1963c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.undo); 1964c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1965c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook mTextView.onTextContextMenuItem(android.R.id.redo); 1966c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook assertEquals("flower", mTextView.getText().toString()); 1967c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook } 1968c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook 1969a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_setText() throws Throwable { 19716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 197228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1973c1198c0aa7c7e9b52a32d9e2c0d663c69ee131c6James Cook // Create two undo operations, an insert and a delete. 1974b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "xyz"); 1975b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL, 1976b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu KeyEvent.KEYCODE_DEL, KeyEvent.KEYCODE_DEL); 19779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears both undo operations, so undo doesn't happen. 19796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 19806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 19826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 19836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Clearing text programmatically does not undo either. 19846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 19856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 19866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 1987277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 1988277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 1989277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 199028715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 1991a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 19924b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testRedo_setText() throws Throwable { 19936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 1994277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 1995277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. This creates an undo entry. 1996b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 19979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 19986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing to create a redo entry. 19996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 2000277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Calling setText() clears the redo stack, so redo doesn't happen. 20026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello", BufferType.EDITABLE); 20036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.redo); 20046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("Hello", mTextView.getText().toString()); 2005277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2006277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2007277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 2008277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2009a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directAppend() throws Throwable { 20116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 201228715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 2013277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 2014b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. 20176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("def"); 20186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abcdef", mTextView.getText().toString()); 2019277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the append as a separate step. 20216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 2023277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 20256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2027277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2028277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2029277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 2030277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2031a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20324b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_directInsert() throws Throwable { 20336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2034277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2035277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 2036b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Directly modify the underlying Editable to insert some text. 20396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // NOTE: This is a violation of the API of getText() which specifies that the 20406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // returned object should not be modified. However, some apps do this anyway and 20416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // the framework needs to handle it. 20426beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Editable text = (Editable) mTextView.getText(); 20436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu text.insert(0, "def"); 20446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("defabc", mTextView.getText().toString()); 20456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo removes the insert as a separate step. 20476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 20496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 20506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Another undo removes the original typing. 20516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2053277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2054277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2055277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 2056277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2058a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2059c530472a02205f0b7d87f9f06140c56ca0849816James Cook public void testUndo_noCursor() { 2060c530472a02205f0b7d87f9f06140c56ca0849816James Cook initTextViewForTyping(); 2061c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Append some text to create an undo operation. There is no cursor present. 20636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("cat"); 2064c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Place the cursor at the end of the text so the undo will have to change it. 20666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 3); 2067c530472a02205f0b7d87f9f06140c56ca0849816James Cook 20686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the append. This should not crash, despite not having a valid cursor 20696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // position in the undo operation. 20706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 2071c530472a02205f0b7d87f9f06140c56ca0849816James Cook } 2072c530472a02205f0b7d87f9f06140c56ca0849816James Cook 2073a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 20744b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_textWatcher() throws Throwable { 20756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2076277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2077277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Add a TextWatcher that converts the text to spaces on each change. 2078277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2079277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 2080277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Type some text. 2081b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 20829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 20836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // TextWatcher altered the text. 20846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2085277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 20866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 20876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 20886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 2089277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook }); 2090277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mInstrumentation.waitForIdleSync(); 2091c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook } 2092c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 20936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2094a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2095c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook public void testUndo_textWatcherDirectAppend() { 2096c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook initTextViewForTyping(); 2097c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 2098c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook // Add a TextWatcher that converts the text to spaces on each change. 2099c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook mTextView.addTextChangedListener(new ConvertToSpacesTextWatcher()); 2100c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 21016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Programmatically append some text. The TextWatcher changes it to spaces. 21026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.append("abc"); 21036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals(" ", mTextView.getText().toString()); 2104c4dca4185874f3a78380439d678f1a8fa86f7a66James Cook 21056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo reverses both changes in one step. 21066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 210828715a6877392e4e63cb2b0170c1592fb50079dcJames Cook } 210928715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 2110a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21114b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_shortcuts() throws Throwable { 21126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 211328715a6877392e4e63cb2b0170c1592fb50079dcJames Cook 211428715a6877392e4e63cb2b0170c1592fb50079dcJames Cook // Type some text. 2115b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 21169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Z triggers undo. 21186beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent control = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 0, 21196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 21206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, control)); 21216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 21236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Pressing Control-Shift-Z triggers redo. 21246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent controlShift = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_Z, 21256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 0, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_SHIFT_LEFT_ON); 21266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.onKeyShortcut(KeyEvent.KEYCODE_Z, controlShift)); 21276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 21285b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21295b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21305b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 21315b51f77b99861d48fec1c327252416f726b3b01aJames Cook 2132a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21334b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceState() throws Throwable { 21346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 21355b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21365b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Type some text to create an undo operation. 2137b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 21389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the TextView. 21406beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21416beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21425b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21435b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21445b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21455b51f77b99861d48fec1c327252416f726b3b01aJames Cook // Delete a character to create a new undo operation. 2146b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ab", mTextView.getText().toString()); 21495b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the delete. 21516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abc", mTextView.getText().toString()); 21535b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Undo the typing, which verifies that the original undo operation was parceled 21556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // correctly. 21566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21585f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Parcel and unparcel the undo stack (which is empty but has been used and may 21606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // contain other state). 21616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21635f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21645f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21655f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook } 21665f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 2167a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 21684b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testUndo_saveInstanceStateEmpty() throws Throwable { 21696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 21705f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21715f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Type and delete to create two new undo operations. 2172b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2173b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Empty the undo stack then parcel and unparcel the TextView. While the undo 21766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // stack contains no operations it may contain other state. 21776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Parcelable state = mTextView.onSaveInstanceState(); 21806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onRestoreInstanceState(state); 21815f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook }); 21825f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook mInstrumentation.waitForIdleSync(); 21835f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook 21845f31960d0d0e9aac4b48e895ee8fd144791a5109James Cook // Create two more undo operations. 2185b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2186b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 21879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 21886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Verify undo still works. 21896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("b", mTextView.getText().toString()); 21916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.undo); 21926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 21935b51f77b99861d48fec1c327252416f726b3b01aJames Cook }); 21945b51f77b99861d48fec1c327252416f726b3b01aJames Cook mInstrumentation.waitForIdleSync(); 21955b51f77b99861d48fec1c327252416f726b3b01aJames Cook } 21965b51f77b99861d48fec1c327252416f726b3b01aJames Cook 21976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2198a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2199b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCopyAndPaste() { 2200b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 22016beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 22036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 22046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Copy "bc". 22066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 22076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 22086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "bc" between "b" and "c". 22106beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 22116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("abbccd", mTextView.getText().toString()); 22136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select entire text and paste "bc". 22156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22166beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22176beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bc", mTextView.getText().toString()); 2218b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2219b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2220a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 22214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCopyAndPaste_byKey() throws Throwable { 22226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 222349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 222449279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2225b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 22269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 22286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 222949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 223049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 223149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Copy "bc" 2232b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_COPY); 223349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set cursor between 'b' and 'c'. 22366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 2, 2); 223749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 223849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 223949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2240b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 224149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("abbcc", mTextView.getText().toString()); 224249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 22446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 22466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_COPY, 0, KeyEvent.META_SHIFT_LEFT_ON); 22476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + copy doesn't perform copy. 22486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcabbcc", mTextView.getText().toString()); 22526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 22566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + copy doesn't perform copy. 22576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcabbcc", mTextView.getText().toString()); 22616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 22636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu copyWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COPY, 0, 22646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 22656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + copy doesn't perform copy. 22666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_COPY, copyWithMeta); 22676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 22686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bcbcbcabbcc", mTextView.getText().toString()); 227049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 22718e9fc4a5b2274a1279261f1a36c5396b9884042dKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 227249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 227349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 22746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2275a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2276b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste() { 2277b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 22786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("abcd", BufferType.EDITABLE); 22806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 22816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "bc". 22836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 22846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22856beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 22866beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22876beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut "ad". 22886beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 2); 22896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 22906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 22916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 22926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste "ad". 22936beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 22946beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("ad", mTextView.getText().toString()); 2295b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2296b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2297a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 22984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testCutAndPaste_byKey() throws Throwable { 22996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 230049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 230149279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Type "abc". 2302b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "abc"); 23039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 23046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Select "bc" 23056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 3); 230649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 230749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 230849279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Cut "bc" 2309b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_CUT); 231049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 23119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 23126beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("a", mTextView.getText().toString()); 23136beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Move cursor to the head 23146beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 0, 0); 231549279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 231649279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 231749279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi // Paste "bc" 2318b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_PASTE); 231949279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi assertEquals("bca", mTextView.getText().toString()); 232049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 23214b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 23226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, 23246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.KEYCODE_CUT, 0, KeyEvent.META_SHIFT_LEFT_ON); 23256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Shift + cut doesn't perform cut. 23266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 23276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 23286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 23306beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_CTRL_LEFT_ON); 23316beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + cut doesn't perform cut. 23326beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 23336beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 23346beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23356beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu cutWithMeta = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CUT, 0, 23366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_CTRL_LEFT_ON); 23376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Control + Shift + cut doesn't perform cut. 23386beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onKeyDown(KeyEvent.KEYCODE_CUT, cutWithMeta); 23396beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("bca", mTextView.getText().toString()); 234049279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi }); 23412de5a65a1540ec0b1ed03ec75c49ff9c242331baSiyamed Sinir mInstrumentation.waitForIdleSync(); 234249279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi } 234349279f3ccd432c3d9611ee3c357ebb407b84c5c5Keisuke Kuroyanagi 2344b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi private static boolean hasSpansAtMiddleOfText(final TextView textView, final Class<?> type) { 2345b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final Spannable spannable = (Spannable)textView.getText(); 2346b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi final int at = spannable.length() / 2; 2347b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi return spannable.getSpans(at, at, type).length > 0; 2348b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2349b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 23506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 2351a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2352b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi public void testCutAndPaste_withAndWithoutStyle() { 2353b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi initTextViewForTyping(); 23546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("example", BufferType.EDITABLE); 23566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 23576beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23586beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set URLSpan. 23596beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Spannable spannable = (Spannable) mTextView.getText(); 23606beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu spannable.setSpan(new URLSpan("http://example.com"), 0, spannable.length(), 0); 23616beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23626beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23636beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Cut entire text. 23646beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.cut); 23666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("", mTextView.getText().toString()); 23676beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23686beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste without style. 23696beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.pasteAsPlainText); 23706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23716beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text doesn't have URLSpan. 23726beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 23736beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu 23746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Paste with style. 23756beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 23766beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.paste); 23776beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertEquals("example", mTextView.getText().toString()); 23786beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Check that the text has URLSpan. 23796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(hasSpansAtMiddleOfText(mTextView, URLSpan.class)); 2380b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi } 2381b07a600d96f12f712b7914822fea7db15b881a5dKeisuke Kuroyanagi 2382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2383a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 23844ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien public void testSaveInstanceState() { 2385baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // should save text when freezesText=true 23864ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView originalTextView = new TextView(mActivity); 23874ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 23884ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setText(text); 23894ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien originalTextView.setFreezesText(true); // needed to actually save state 23904ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien Parcelable state = originalTextView.onSaveInstanceState(); 23914ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23924ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien TextView restoredTextView = new TextView(mActivity); 23934ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien restoredTextView.onRestoreInstanceState(state); 23944ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien assertEquals(text, restoredTextView.getText().toString()); 23954ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 23964ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 23974ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2398a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2399baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_whenFreezesTextIsFalse() { 24004ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien final String text = "This is a string"; 2401baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text when freezesText=false 2402baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2403baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2404baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2405baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 24064ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 2407baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2408baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2409baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2410baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2411baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2412baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2413baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2414baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2415baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2416baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir { // should not save text even when textIsSelectable=true 2417baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2418baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2419baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2420baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2421baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2422baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2423baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2424baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2425baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2426baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2427baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2428baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2429baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2430baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2431baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2432baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2433baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2434baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2435baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2436a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2437baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotSaveSelectionWhenDoesNotExist() { 2438baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2439baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2440baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2441baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2442baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2443baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2444baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2445baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2446baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2447baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2448baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2449baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2450baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionStart()); 2451baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(-1, textView2.getSelectionEnd()); 2452baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2453baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2454baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2455baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2456a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2457baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_doesNotRestoreSelectionWhenTextIsAbsent() { 2458baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2459baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2460baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2461baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(false); 2462baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2463baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2464baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2465baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2466baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2467baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2468baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(false); 2469baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2470baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2471baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2472baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2473baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals("", textView2.getText().toString()); 2474baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir //when textIsSelectable, selection start and end are initialized to 0 2475baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionStart()); 2476baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(0, textView2.getSelectionEnd()); 2477baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir } 2478baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2479baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @UiThreadTest 2480baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir @SmallTest 2481a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2482baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir public void testOnSaveInstanceState_savesSelectionWhenExists() { 2483baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir final String text = "This is a string"; 2484baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for before saveInstanceState 2485baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView1 = new TextView(mActivity); 2486baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setFreezesText(true); 2487baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setTextIsSelectable(true); 2488baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView1.setText(text); 2489baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir Selection.setSelection((Spannable) textView1.getText(), 2, text.length() - 2); 2490baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2491baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir // prepare TextView for after saveInstanceState 2492baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir TextView textView2 = new TextView(mActivity); 2493baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setFreezesText(true); 2494baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.setTextIsSelectable(true); 2495baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2496baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir textView2.onRestoreInstanceState(textView1.onSaveInstanceState()); 2497baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir 2498baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionStart(), textView2.getSelectionStart()); 2499baeafb8c1c7feacfa0fd684d38646ac24d642e34Siyamed Sinir assertEquals(textView1.getSelectionEnd(), textView2.getSelectionEnd()); 25004ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien } 25014ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien 25024ed3b6c02b917394dfc68c4d421c4b935a3325c8Raph Levien @UiThreadTest 2503a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2504fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetText() { 2505fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextView tv = findTextView(R.id.textview_text); 2506fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2507fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int resId = R.string.text_view_hint; 2508fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String result = mActivity.getResources().getString(resId); 2509fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2510fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.EDITABLE); 2511fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2512fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Editable); 2513fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2514fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(resId, BufferType.SPANNABLE); 2515fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(result, tv.getText().toString()); 2516fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(tv.getText() instanceof Spannable); 2517fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2518fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2519fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su tv.setText(-1, BufferType.EDITABLE); 2520fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception with illegal id"); 2521fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2522fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2523fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2524fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2525fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2526a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2527fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessHint() { 2528fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_hint_linksclickable_freezestext); 2529fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2530fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_linksClickable_freezesText_default); 2531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getHint()); 2532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_blank); 2534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getHint()); 2535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_string); 2537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_simple_hint), 2538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.hint_resid); 2541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hint), 2542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint()); 2543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint("This is hint"); 2545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("This is hint", mTextView.getHint().toString()); 2546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(R.string.text_view_hello); 2548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 2549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHint().toString()); 2550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Non-exist resid 2552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setHint(-1); 2554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw exception if id is illegal"); 2555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NotFoundException e) { 2556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2559a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 25604b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessError() throws Throwable { 2561fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2562fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2563fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 256453b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner final String errorText = "Oops! There is an error"; 2565fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null)); 2567fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2568fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2569fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2570a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable icon = TestUtils.getDrawable(mActivity, R.drawable.failed); 25719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(errorText, icon)); 2572fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2573fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2574fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // can not check whether the drawable is set correctly 2575fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setError(null, null)); 2577fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2578fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2579fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance("")); 25826beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 25846beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2585fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2586fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2587fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2588fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(errorText, mTextView.getError().toString()); 2589fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2590b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2591fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event that will not change the TextView's text 2592fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("", mTextView.getText().toString()); 2593fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // The icon and error message will not be reset to null 259453b55f734fb3cf52df49a79cf76d410a77fbe8f5Craig Mautner assertEquals(errorText, mTextView.getError().toString()); 2595fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 25969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 25976beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(DigitsKeyListener.getInstance()); 25986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 25996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setError(errorText); 26006beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2601300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu }); 2602300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu mInstrumentation.waitForIdleSync(); 2603300d755fcaa7274f1570f53d34c7a657bc420ab6Brian Muramatsu 2604b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "1"); 2605fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // a key event cause changes to the TextView's text 2606fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("1", mTextView.getText().toString()); 2607fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the error message and icon will be cleared. 2608fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getError()); 2609fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2610fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2611a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26124b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessFilters() throws Throwable { 2613fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final InputFilter[] expected = { new InputFilter.AllCaps(), 2614fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su new InputFilter.LengthFilter(2) }; 2615fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2616fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener 2617fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su = QwertyKeyListener.getInstance(false, Capitalize.NONE); 26189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 26196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 26206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 26216beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 26226beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFilters(expected); 26236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 2624fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2625fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2626fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2627fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(expected, mTextView.getFilters()); 2628fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2629b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2630fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2631fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("A", mTextView.getText().toString()); 2632b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2633fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the text is capitalized by InputFilter.AllCaps 2634fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2635b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "c"); 2636fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 'C' could not be accepted, because there is a length filter. 2637fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("AB", mTextView.getText().toString()); 2638fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2639fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2640fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setFilters(null); 2641fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw IllegalArgumentException!"); 2642fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (IllegalArgumentException e) { 2643fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2644fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2645fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2646a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 26474b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetFocusedRect() throws Throwable { 2648fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 2649fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2650fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Basic 26519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 26529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2653fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2654fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2655fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2656fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2657fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2658fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2659fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Single line 2660fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2661fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2662fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX(), rc.left); 2663fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2664fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY(), rc.top); 2665fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2666fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 26679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 266888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 266988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26706beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 267188b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 3, 13); 2672fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2673fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2674fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(rc); 2675fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView.getLayout()); 2676fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien /* Cursor coordinates from getPrimaryHorizontal() may have a fractional 2677fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * component, while the result of getFocusedRect is in int coordinates. 2678fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * It's not practical for these to match exactly, so we compare that the 2679fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * integer components match - there can be a fractional pixel 2680fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien * discrepancy, which should be okay for all practical applications. */ 2681fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3), rc.left); 2682fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(13), rc.right); 2683fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2684fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2685fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 26869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 268788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 268888b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 26896beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 269088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 13, 3); 2691fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2692fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2693fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2694fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2695fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) - 2, rc.left); 2696fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(3) + 2, rc.right); 2697fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2698fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2699fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 2700fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio // Multi lines 2701fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView = findTextView(R.id.textview_text_two_lines); 2702fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2703fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX(), rc.left); 2704fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollX() + mTextView.getWidth(), rc.right); 2705fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY(), rc.top); 2706fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getScrollY() + mTextView.getHeight(), rc.bottom); 2707fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 27089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 270988b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 271088b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 27116beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 271288b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 4); 2713fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2714fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2715fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2716fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2717fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(2), rc.left); 2718fe2fb182b7998f5384f78a6956962966b10b5699Raph Levien assertEquals((int) mTextView.getLayout().getPrimaryHorizontal(4), rc.right); 2719fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2720fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(0), rc.bottom); 2721fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio 27229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 272388b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir final SpannableString text = new SpannableString(mTextView.getText()); 272488b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir mTextView.setTextIsSelectable(true); 27256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text); 272688b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir // cross the "\n" and two lines 272788b882ec824156753c577ed8ff5de2b17449331fSiyamed Sinir Selection.setSelection((Spannable) mTextView.getText(), 2, 10); 2728fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio }); 2729fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mInstrumentation.waitForIdleSync(); 2730fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getFocusedRect(rc); 2731fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio Path path = new Path(); 2732fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio mTextView.getLayout().getSelectionPath(2, 10, path); 2733fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio RectF rcf = new RectF(); 2734fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio path.computeBounds(rcf, true); 2735fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertNotNull(mTextView.getLayout()); 2736a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.left - 1, (float) rc.left, 0.0f); 2737a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(rcf.right + 1, (float) rc.right, 0.0f); 2738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineTop(0), rc.top); 2739fb0961aa68799b42121f3d8cac094b341c2f9084Fabrice Di Meglio assertEquals(mTextView.getLayout().getLineBottom(1), rc.bottom); 2740fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2741fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Exception 2742fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 2743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getFocusedRect(null); 2744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 2745fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 2746fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2747fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2748fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2749a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetLineCount() throws Throwable { 27519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = findTextView(R.id.textview_text)); 27529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // this is an one line text with default setting. 2754fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2755fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multi-lines 2757fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(mTextView.getWidth() / 3); 2758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(1 < mTextView.getLineCount()); 2759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2760fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it to an one line 2761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMaxWidth(Integer.MAX_VALUE); 2762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2763fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2764fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set min lines don't effect the lines count for actual text. 2765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(12); 2766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 2767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // the internal Layout has not been built. 2771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getLayout()); 2772fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineCount()); 2773fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2775a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 27764b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetLineBounds() throws Throwable { 2777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Rect rc = new Rect(); 27789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 27799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2780fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, null)); 2781fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2782fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getLineBounds(0, rc)); 2783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.right); 2785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.bottom); 2787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2789fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, null)); 2790fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2791fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2792fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.left); 2793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth(), rc.right); 2794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, rc.top); 2795fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight(), rc.bottom); 2796fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 27979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 27986beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 27996beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2800fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2801fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2802fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getBaseline(), mTextView.getLineBounds(0, rc)); 2803fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingLeft(), rc.left); 2804fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getWidth() - mTextView.getTotalPaddingRight(), rc.right); 2805fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getTotalPaddingTop(), rc.top); 2806fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getHeight() - mTextView.getTotalPaddingBottom(), rc.bottom); 2807fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2808fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2809a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28104b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetBaseLine() throws Throwable { 28119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 28129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(-1, mTextView.getBaseline()); 2814fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2816fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getLayout().getLineBaseline(0), mTextView.getBaseline()); 2817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 28189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28196beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 28206beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2821fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getTotalPaddingTop() + mTextView.getLayout().getLineBaseline(0); 2824fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getBaseline()); 2825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2827a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 28284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testPressKey() throws Throwable { 28296beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu initTextViewForTypingOnUiThread(); 2830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2831b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "a"); 2832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2833b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendString(mInstrumentation, mTextView, "b"); 2834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("ab", mTextView.getText().toString()); 2835b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, KeyEvent.KEYCODE_DEL); 2836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("a", mTextView.getText().toString()); 2837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2839a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2840aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky public void testKeyNavigation() throws Throwable { 2841aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky initTextViewForTypingOnUiThread(); 2842aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivityRule.runOnUiThread(() -> { 2843aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_singleLine).setFocusableInTouchMode(true); 2844aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mActivity.findViewById(R.id.textview_text_two_lines).setFocusableInTouchMode(true); 2845aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 2846aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setText("abc"); 2847aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.setFocusableInTouchMode(true); 2848aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky }); 2849aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2850aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mTextView.requestFocus(); 2851aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2852aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2853aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2854fe49a004799c033138db0bb86990083d91e64521Evan Rosky // Pure-keyboard arrows should not cause focus to leave the textfield 2855aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP); 2856aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2857aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2858aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2859fe49a004799c033138db0bb86990083d91e64521Evan Rosky // Non-pure-keyboard arrows, however, should. 2860fe49a004799c033138db0bb86990083d91e64521Evan Rosky int dpadRemote = InputDevice.SOURCE_DPAD | InputDevice.SOURCE_KEYBOARD; 2861fe49a004799c033138db0bb86990083d91e64521Evan Rosky sendSourceKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_UP, dpadRemote); 2862fe49a004799c033138db0bb86990083d91e64521Evan Rosky mInstrumentation.waitForIdleSync(); 2863fe49a004799c033138db0bb86990083d91e64521Evan Rosky assertFalse(mTextView.isFocused()); 2864fe49a004799c033138db0bb86990083d91e64521Evan Rosky 2865fe49a004799c033138db0bb86990083d91e64521Evan Rosky sendSourceKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_DPAD_DOWN, dpadRemote); 2866aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2867aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertTrue(mTextView.isFocused()); 2868aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2869aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky // Tab should 2870aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky CtsKeyEventUtil.sendKeyDownUp(mInstrumentation, mTextView, KeyEvent.KEYCODE_TAB); 2871aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky mInstrumentation.waitForIdleSync(); 2872aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky assertFalse(mTextView.isFocused()); 2873aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky } 2874aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky 2875fe49a004799c033138db0bb86990083d91e64521Evan Rosky private void sendSourceKeyDownUp(Instrumentation instrumentation, View targetView, int key, 2876fe49a004799c033138db0bb86990083d91e64521Evan Rosky int source) { 2877fe49a004799c033138db0bb86990083d91e64521Evan Rosky KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, key); 2878fe49a004799c033138db0bb86990083d91e64521Evan Rosky event.setSource(source); 2879fe49a004799c033138db0bb86990083d91e64521Evan Rosky CtsKeyEventUtil.sendKey(instrumentation, targetView, event); 2880fe49a004799c033138db0bb86990083d91e64521Evan Rosky event = new KeyEvent(KeyEvent.ACTION_UP, key); 2881fe49a004799c033138db0bb86990083d91e64521Evan Rosky event.setSource(source); 2882fe49a004799c033138db0bb86990083d91e64521Evan Rosky CtsKeyEventUtil.sendKey(instrumentation, targetView, event); 2883fe49a004799c033138db0bb86990083d91e64521Evan Rosky } 2884fe49a004799c033138db0bb86990083d91e64521Evan Rosky 2885aad73c8ab31eb4f3dc4ad20c1b813592e6c3e42cEvan Rosky @Test 28864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetIncludeFontPadding() throws Throwable { 2887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 2888ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertTrue(mTextView.getIncludeFontPadding()); 28899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 28906beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setWidth(mTextView.getWidth() / 3); 28916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setPadding(1, 2, 3, 4); 28926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 2893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 2894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int oldHeight = mTextView.getHeight(); 28979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setIncludeFontPadding(false)); 2898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 2899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() < oldHeight); 2901ac8bc1679adcd60c7d0b1580d468ae1f58894d4fRaph Levien assertFalse(mTextView.getIncludeFontPadding()); 2902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2903fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 29049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2905a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testScroll() { 2907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //don't set the Scroller, nothing changed. 2913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollX()); 2915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getScrollY()); 2916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the Scroller 2918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Scroller s = new Scroller(mActivity); 2919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(s); 2920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.startScroll(0, 0, 320, 480, 0); 2921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.abortAnimation(); 2922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su s.forceFinished(false); 2923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setScroller(s); 2924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.computeScroll(); 2926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(320, mTextView.getScrollX()); 2927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(480, mTextView.getScrollY()); 2928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2930a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDebug() throws Throwable { 29329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 29339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 29349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.debug(0); 29359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("Hello!"); 29369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 29379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 2938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su layout(mTextView); 2940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.debug(1); 2941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 29439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 2944a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSelection() throws Throwable { 2946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 2947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String text = "This is the content"; 2948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(text, BufferType.SPANNABLE); 2949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.selectAll((Spannable) mTextView.getText()); 2952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getSelectionStart()); 2953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(text.length(), mTextView.getSelectionEnd()); 2954fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2955fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2956fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionStart = 5; 2957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int selectionEnd = 7; 2958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart); 2959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionEnd()); 2961fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.hasSelection()); 2962fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Selection.setSelection((Spannable) mTextView.getText(), selectionStart, selectionEnd); 2964fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionStart, mTextView.getSelectionStart()); 2965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(selectionEnd, mTextView.getSelectionEnd()); 2966fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.hasSelection()); 2967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 2968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 2969a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 29709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testOnSelectionChangedIsTriggeredWhenSelectionChanges() throws Throwable { 29716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String text = "any text"; 29729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 29739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 29749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 29756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // assert that there is currently no selection 29779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(mTextView.hasSelection()); 29786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // select all 29809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.selectAll((Spannable) mTextView.getText()); 2981b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // After selectAll OnSelectionChanged should have been called 29829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(0, text.length()); 29836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // change selection 29869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.setSelection((Spannable) mTextView.getText(), 1, 5); 29879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(1, 5); 29886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 29899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 29906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // clear selection 29919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Selection.removeSelection((Spannable) mTextView.getText()); 29929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).onSelectionChanged(-1, -1); 29936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 29946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 2995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 2996a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 2997fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessEllipsize() { 2998fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mActivity.setContentView(R.layout.textview_ellipsize); 2999fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_default); 3001fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 3002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_none); 3004fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 3005fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3006fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_start); 3007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.START, mTextView.getEllipsize()); 3008fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_middle); 3010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.MIDDLE, mTextView.getEllipsize()); 3011fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3012fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.ellipsize_end); 3013fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TruncateAt.END, mTextView.getEllipsize()); 3014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3015fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 3016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 3017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); 3019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.MIDDLE, mTextView.getEllipsize()); 3020fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3021fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.END); 3022fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.END, mTextView.getEllipsize()); 3023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3024fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(null); 3025fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getEllipsize()); 3026fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3027fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(10); 3028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setEllipsize(TextUtils.TruncateAt.START); 3029fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("ThisIsAVeryLongVeryLongVeryLongVeryLongVeryLongWord"); 3030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.invalidate(); 3031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(TextUtils.TruncateAt.START, mTextView.getEllipsize()); 3033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no method to check if '...yLongVeryLongWord' is painted in the screen. 3034fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3036a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 303792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForSingleLine() throws Throwable { 303892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline or ellipsize set, single line text 303992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 304092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 304192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a"); 304292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 304392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with two lines 304492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 304592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(1); 304692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 304792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na"); 304892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 304992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with two lines 305092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 305192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 305292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(1); 305392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 305492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na"); 30552deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 305692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 305792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 305892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 305992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 306092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 306192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 306292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 306392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 306492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 306592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 306692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 306792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 30689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 30692deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 307092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 307192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 307292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 307392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 307492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 307592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(0)); 307692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 307792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getLayout().getLineBaseline(0), 307892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(0)); 307992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 308092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 308192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir @Test 308292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForMultiLine() throws Throwable { 308392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, text with two lines 308492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvNoMaxLine = new TextView(mActivity); 308592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setLineSpacing(0, 1.5f); 308692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.setText("a\na"); 308792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 308892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, text with three lines 308992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 309092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 309192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 309292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setText("a\na\na"); 309392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 309492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, text with three lines 309592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 309692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 309792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 309892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 309992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setText("a\na\na"); 31006031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 31012deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 31022deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 310392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 310492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 31052deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 310692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvNoMaxLine, layoutParams); 310792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 310892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 310992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 311092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 311192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 311292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 311392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3114a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 31152deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 311692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvEllipsizeNone.getHeight()); 311792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 311892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals(tvEllipsizeEnd.getHeight(), tvNoMaxLine.getHeight()); 311992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 312092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir for (int i = 0; i < tvEllipsizeEnd.getLineCount(); i++) { 312192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 312292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 312392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.getLayout().getLineBaseline(i)); 312492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 312592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Should have the same baseline for line " + i, 312692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.getLayout().getLineBaseline(i), 312792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvNoMaxLine.getLayout().getLineBaseline(i)); 312892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir } 31292deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 31302deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 3131a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 313292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir public void testEllipsizeAndMaxLinesForHint() throws Throwable { 313392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with two lines 313492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvTwoLines = new TextView(mActivity); 313592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setLineSpacing(0, 1.5f); 313692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.setHint("a\na"); 31372deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 313892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // no maxline, no ellipsize, hint with three lines 313992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvThreeLines = new TextView(mActivity); 314092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setLineSpacing(0, 1.5f); 314192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.setHint("a\na\na"); 314292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 314392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, ellipsize end, hint with three lines 314492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeEnd = new TextView(mActivity); 314592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setEllipsize(TruncateAt.END); 314692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setMaxLines(2); 314792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setLineSpacing(0, 1.5f); 314892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeEnd.setHint("a\na\na"); 31492deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 315092cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir // maxline set, no ellipsize, hint with three lines 315192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir final TextView tvEllipsizeNone = new TextView(mActivity); 315292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setMaxLines(2); 315392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setLineSpacing(0, 1.5f); 315492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvEllipsizeNone.setHint("a\na\na"); 31556031df7acadcd35236309edcbb046847735bda65Siyamed Sinir 31562deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 31572deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 315892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 315992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 31602deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 316192cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvTwoLines, layoutParams); 316292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeEnd, layoutParams); 316392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvEllipsizeNone, layoutParams); 316492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir layout.addView(tvThreeLines, layoutParams); 31652deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 316692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout, 316792cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir new ViewGroup.LayoutParams( 316892cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 316992cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT))); 3170a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 31712deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 317292cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Non-ellipsized hint should not crop text at maxLines", 317392cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvThreeLines.getHeight(), tvEllipsizeNone.getHeight()); 317492cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir 317592cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir assertEquals("Ellipsized hint should crop text at maxLines", 317692cd9119d1dbcb9664a830f216920d5bbde961a1Siyamed Sinir tvTwoLines.getHeight(), tvEllipsizeEnd.getHeight()); 31772deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir } 31782deef38f19cb26869b600cd0d075753a9f97d5daSiyamed Sinir 31799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3180a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3181354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov public void testAccessCursorVisible() { 3182fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(true); 3185354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(mTextView.isCursorVisible()); 3186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCursorVisible(false); 3187354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertFalse(mTextView.isCursorVisible()); 3188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3191a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testPerformLongClick() { 3193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 3194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText("This is content"); 3195938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3196938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnLongClickListener mockOnLongClickListener = mock(View.OnLongClickListener.class); 3197938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.TRUE); 3198938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3199938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov View.OnCreateContextMenuListener mockOnCreateContextMenuListener = 3200938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mock(View.OnCreateContextMenuListener.class); 32014e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov doAnswer((InvocationOnMock invocation) -> { 32024e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov ((ContextMenu) invocation.getArguments() [0]).add("menu item"); 32034e47d86641f4cbf8269723cca1a2ca1250f9aa02Kirill Grouchnikov return null; 3204938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov }).when(mockOnCreateContextMenuListener).onCreateContextMenu( 320527c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3206938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 3207938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnLongClickListener(mockOnLongClickListener); 3208938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener); 3209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3210938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3211938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyZeroInteractions(mockOnCreateContextMenuListener); 3212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3213938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnLongClickListener); 3214938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov when(mockOnLongClickListener.onLongClick(any(View.class))).thenReturn(Boolean.FALSE); 3215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.performLongClick()); 3216938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnLongClickListener, times(1)).onLongClick(mTextView); 3217938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 321827c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3220938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov reset(mockOnCreateContextMenuListener); 3221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setOnLongClickListener(null); 3222938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu( 322327c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), any(View.class), any()); 3224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.performLongClick()); 3225938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verifyNoMoreInteractions(mockOnLongClickListener); 3226938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu( 322727c343ee1da9be7adb5b5c7b916fa7bc8e07e14dAurimas Liutikas any(ContextMenu.class), eq(mTextView), any()); 3228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3231a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testTextAttr() { 3233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_textAttr); 3234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getText 3235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getString(R.string.text_view_hello), mTextView.getText().toString()); 3236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getCurrentTextColor 3238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 3239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 3240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 3242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 3243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getHintTextColors().getDefaultColor()); 3244fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 3245fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 3246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextScaleX 3248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1.2f, mTextView.getTextScaleX(), 0.01f); 3249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // setTextScaleX 3251fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(2.4f); 3252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2.4f, mTextView.getTextScaleX(), 0.01f); 3253fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3254fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(0f); 3255fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0f, mTextView.getTextScaleX(), 0.01f); 3256fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextScaleX(- 2.4f); 3258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(- 2.4f, mTextView.getTextScaleX(), 0.01f); 3259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTextSize 3261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 3262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // getTypeface 3264119351956fc53fdd61bfbfb0d1ab43857cf7a6d7Peter Eliasson // getTypeface will be null if android:typeface is set to normal, 3265c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // and android:style is not set or is set to normal, and 3266c02a9f453c5c1255d668bbd8970f4585ab5ff494Alan Viverette // android:fontFamily is not set 3267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT); 3270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.DEFAULT, mTextView.getTypeface()); 3271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face 3272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null); 3273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTypeface()); 3274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // default type face, bold style, note: the type face will be changed 3276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // after call set method 3277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, Typeface.BOLD); 3278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // null type face, BOLD style 3281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(null, Typeface.BOLD); 3282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(Typeface.BOLD, mTextView.getTypeface().getStyle()); 3283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // old type face, null style 3285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTypeface(Typeface.DEFAULT, 0); 3286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 3287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3290a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAppend() { 3292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 1: check the original length, should be blank as initialised. 3295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getText().length()); 3296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 2: append a string use append(CharSquence) into the original blank 3298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // buffer, check the content. And upgrading it to BufferType.EDITABLE if it was 3299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // not already editable. 3300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(mTextView.getText() instanceof Editable); 3301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append."); 3302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.", mTextView.getText().toString()); 3303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 3: append a string from 0~3. 3306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 3); 3307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 4: append a string from 0~0, nothing will be append as expected. 3311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 0, 0); 3312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals("Append.App", mTextView.getText().toString()); 3313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getText() instanceof Editable); 3314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 5: append a string from -3~3. check the wrong left edge. 3316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", -3, 3); 3318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 6: append a string from 3~10. check the wrong right edge. 3323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append("Append", 3, 10); 3325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw StringIndexOutOfBoundsException"); 3326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (StringIndexOutOfBoundsException e) { 3327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // 7: append a null string. 3330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 3331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.append(null); 3332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException"); 3333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 3334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3337f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3338a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3339f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAppendedTextDoesNotContainLinks() { 3340f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3341f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3342f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3343f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3344f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" another text without URL"); 3345f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3346f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3347f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3348f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3349f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL another text without URL", text.toString()); 3350f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3351f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3352f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3353a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3354f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_doesNotAddLinksWhenAutoLinkIsNotEnabled() { 3355f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3356f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3357f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3358f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3359f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3360f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3361f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3362f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be zero", 0, urlSpans.length); 3363f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3364f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3365f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3366f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3367a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3368f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenAutoLinkIsEnabled() { 3369f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3370f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3371f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without URL"); 3372f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3373f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3374f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3375f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3376f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3377f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3378f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3379f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3380f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text without URL text with URL http://android.com", text.toString()); 3381f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3382f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3383f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3384a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3385f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksEvenWhenThereAreUrlsSetBefore() { 3386f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3387f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3388f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with URL http://android.com/before"); 3389f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3390f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with URL http://android.com"); 3391f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3392f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3393f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3394f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be two after appending another URL", 2, urlSpans.length); 3395f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("First URLSpan URL should be same", 3396f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/before"); 3397f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3398f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[1].getURL(), "http://android.com"); 3399f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("text with URL http://android.com/before text with URL http://android.com", 3400f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir text.toString()); 3401f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3402f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3403f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3404a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3405f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_setsMovementMethodWhenTextContainsUrlAndAutoLinkIsEnabled() { 3406f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3407f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3408f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3409f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3410f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(" text with a url: http://android.com"); 3411f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3412f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertNotNull("MovementMethod should not be null when text contains url", 3413f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod()); 3414f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertTrue("MovementMethod should be instance of LinkMovementMethod when text contains url", 3415f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.getMovementMethod() instanceof LinkMovementMethod); 3416f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3417f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3418f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3419a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3420f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinksWhenTextIsSpannableAndContainsUrlAndAutoLinkIsEnabled() { 3421f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3422f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3423f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text without a URL"); 3424f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3425f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append(new SpannableString(" text with a url: http://android.com")); 3426f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3427f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3428f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3429f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending a URL", 1, urlSpans.length); 3430f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3431f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3432f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3433f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3434f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3435a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3436f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextCompletesPartialUrlAtTheEndOfExistingText() { 3437f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3438f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3439f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a partial url android."); 3440f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3441f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("com"); 3442f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3443f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3444f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3445f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should be one after appending to partial URL", 3446f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 1, urlSpans.length); 3447f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the appended URL", 3448f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com"); 3449f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3450f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3451f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir @UiThreadTest 3452a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3453f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir public void testAppend_addsLinkIfAppendedTextUpdatesUrlAtTheEndOfExistingText() { 3454f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView = new TextView(mActivity); 3455f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setAutoLinkMask(Linkify.ALL); 3456f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.setText("text with a url http://android.com"); 3457f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3458f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir mTextView.append("/textview"); 3459f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3460f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir Spannable text = (Spannable) mTextView.getText(); 3461f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class); 3462f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan count should still be one after extending a URL", 1, urlSpans.length); 3463f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir assertEquals("URLSpan URL should be same as the new URL", 3464f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir urlSpans[0].getURL(), "http://android.com/textview"); 3465f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir } 3466f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 34679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3468a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetLetterSpacing_returnsValueThatWasSet() { 34706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 34716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLetterSpacing(2f); 34726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getLetterSpacing should return the value that was set", 3473a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov 2f, mTextView.getLetterSpacing(), 0.0f); 34746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 34756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3476a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 34779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testSetLetterSpacingChangesTextWidth() throws Throwable { 34789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 34799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 34809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("aa"); 34819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLetterSpacing(0f); 34829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 34839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 34849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 34856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 34876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 34886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT, 34896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 34909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 34916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 34926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3494a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 34956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with zero letter spacing 34979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float zeroSpacing = mTextView.getLayout().getLineWidth(0); 34986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 34999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(1f)); 3500a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 35016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with single letter spacing 35039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float singleSpacing = mTextView.getLayout().getLineWidth(0); 35046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLetterSpacing(2f)); 3506a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov mInstrumentation.waitForIdleSync(); 35076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // measure text with double letter spacing 35099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final float doubleSpacing = mTextView.getLayout().getLineWidth(0); 35106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("Double spacing should have two times the spacing of single spacing", 35128d7b21a82710d7ec3de82c59e571959a01bb6ce7Raj Mamadgi doubleSpacing - zeroSpacing, 2f * (singleSpacing - zeroSpacing), 2f); 35136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 35159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3516a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetFontFeatureSettings_returnsValueThatWasSet() { 35186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 35196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setFontFeatureSettings("\"smcp\" on"); 35206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals("getFontFeatureSettings should return the value that was set", 35216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir "\"smcp\" on", mTextView.getFontFeatureSettings()); 35226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 35236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 352477030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @UiThreadTest 352577030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka @Test 3526751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka public void testSetGetFontVariationSettings() { 352777030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView = new TextView(mActivity); 3528a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Context context = InstrumentationRegistry.getTargetContext(); 3529a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka Typeface typeface = Typeface.createFromAsset(context.getAssets(), "multiaxis.ttf"); 3530a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setTypeface(typeface); 353177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3532a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // multiaxis.ttf supports "aaaa", "BBBB", "a b ", " C D" axes. 3533a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3534a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // The default variation settings should be null. 353577030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 353677030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 35370d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] invalidFormatSettings = { 3538a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "invalid syntax", 3539a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaa' 1.0", // tag is not 4 ascii chars 35400d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka }; 35410d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka for (String settings : invalidFormatSettings) { 35420d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka try { 35430d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.setFontVariationSettings(settings); 35440d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka fail(); 3545751db87f83c7f5e8e9ab94475cae55b21d466659Seigo Nonaka } catch (IllegalArgumentException e) { 35460d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka // pass. 35470d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 35480d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka assertNull("Must not change settings for " + settings, 35490d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka mTextView.getFontVariationSettings()); 35500d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka } 35510d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka 35520d2c2a46427d5bbb5e7d4bdec662bd4478514b54Seigo Nonaka final String[] nonEffectiveSettings = { 3553a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0", // unsupported tag 3554a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' ' 1.0", // unsupported tag 3555a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'AAAA' 0.7", // unsupported tag (case sensitive) 3556a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "' a b' 1.3", // unsupported tag (white space should not be ignored) 3557a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'C D ' 1.3", // unsupported tag (white space should not be ignored) 3558a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'bbbb' 1.0, 'cccc' 2.0", // none of them are supported. 3559a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3560a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3561a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3562a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse("Must return false for " + notEffectiveSetting, 3563a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.setFontVariationSettings(notEffectiveSetting)); 3564a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertNull("Must not change settings for " + notEffectiveSetting, 3565a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka mTextView.getFontVariationSettings()); 3566a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3567a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3568a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka String retainSettings = "'aaaa' 1.0"; 3569a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(retainSettings)); 3570a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String notEffectiveSetting : nonEffectiveSettings) { 3571a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertFalse(mTextView.setFontVariationSettings(notEffectiveSetting)); 3572a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals("Must not change settings for " + notEffectiveSetting, 3573a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka retainSettings, mTextView.getFontVariationSettings()); 3574a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 3575a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3576a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka // At least one axis is supported, the settings should be applied. 3577a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka final String[] effectiveSettings = { 3578a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0", // supported tag 3579a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'a b ' .7", // supported tag (contains whitespace) 3580a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'BBBB' 0.5", // both are supported 3581a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, ' C D' 0.5", // both are supported 3582a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka "'aaaa' 1.0, 'bbbb' 0.4", // 'bbbb' is unspported. 3583a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka }; 3584a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka 3585a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka for (String effectiveSetting : effectiveSettings) { 3586a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertTrue(mTextView.setFontVariationSettings(effectiveSetting)); 3587a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka assertEquals(effectiveSetting, mTextView.getFontVariationSettings()); 3588a1ee389bedf2d947e148c5900996fff8095ed149Seigo Nonaka } 358977030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 359077030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka mTextView.setFontVariationSettings(""); 359177030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka assertNull(mTextView.getFontVariationSettings()); 359277030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka } 359377030801ef1b43a5bad184f4e4b5f34ce67aa15cSeigo Nonaka 3594a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 35959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionSingleLineLtr() throws Throwable { 35966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // asserts getOffsetPosition returns correct values for a single line LTR text 35979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final String text = "aaaaa"; 359891f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 35999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 36019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(text); 36029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 36039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 36049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 36059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3608a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 36146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 36156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 36169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 36176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 36186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36194b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3620023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 36216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 362201d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir final float horizontalPosFix = (float) Math.ceil( 362301d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir mTextView.getPaint().measureText("a") * 2f / 3f); 362491f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 362591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingLeft = mTextView.getTotalPaddingLeft(); 362691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 36276a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int firstOffset = 0; 36286a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int lastOffset = text.length() - 1; 36296a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final int midOffset = text.length() / 2; 36306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view 36326a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 363391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = mTextView.getHeight() / 2f + paddingTop; 36349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 36356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text 363701d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir x = mTextView.getLayout().getLineWidth(0) + paddingLeft - horizontalPosFix; 36389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset, mTextView.getOffsetForPosition(x, y)); 36396a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36406a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view 36419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth(); 36429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(lastOffset + 1, mTextView.getOffsetForPosition(x, y)); 36436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view - out of bounds 36456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = -1f; 36469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(firstOffset, mTextView.getOffsetForPosition(x, y)); 36476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text 364901d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir x = mTextView.getLayout().getLineWidth(0) / 2f + paddingLeft - horizontalPosFix; 36509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(midOffset, mTextView.getOffsetForPosition(x, y)); 36516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 36526a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3653a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 36549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineLtr() throws Throwable { 3655023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "aaa\n"; 36566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 36579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 36589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 36599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 36609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 36619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 36629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 36639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 36646a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3666a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 36676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 36689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 36696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 36716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 36726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 36736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.WRAP_CONTENT); 36749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 36756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 36766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36774b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3678023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 36796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 36819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 36826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 368301d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir final float horizontalPosFix = (float) Math.ceil( 368401d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir mTextView.getPaint().measureText("a") * 2f / 3f); 368591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 368691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingLeft = mTextView.getTotalPaddingLeft(); 368791f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 36886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 36896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir float x = 0f; 369091f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = lineBounds.height() / 2f + paddingTop; 36919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 36926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 36949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 36959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 36966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 36976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 36989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 369991f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f + paddingTop; 37006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 37026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 37039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 37046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of text at second line 370601d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir x = mTextView.getLayout().getLineWidth(1) + paddingLeft - horizontalPosFix; 37079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 37109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 37119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 371401d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir x = mTextView.getLayout().getLineWidth(1) / 2f + paddingLeft - horizontalPosFix; 37156beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 37169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 37176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 3719a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testGetOffsetForPositionMultiLineRtl() throws Throwable { 3721023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir final String line = "\u0635\u0635\u0635\n"; 37226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final String threeLines = line + line + line; 37239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 37249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 37259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(threeLines); 37269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTextSize(8f); 37279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLines(2); 37289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 37299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 37306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // add a compound drawable to TextView to make offset calculation more interesting 3732a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 37336a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawable.setBounds(0, 0, 10, 10); 37349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(drawable, drawable, drawable, drawable); 37356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout layout = new FrameLayout(mActivity); 37379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final LayoutParams layoutParams = new LayoutParams( 37389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.MATCH_PARENT, 37399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LayoutParams.WRAP_CONTENT); 37409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 37416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 37426a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37434b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 3744023f7673deecf213c762bc7358faba360ccb16e1Siyamed Sinir mInstrumentation.waitForIdleSync(); 37456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37466a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final Rect lineBounds = new Rect(); 37479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(0, lineBounds); 37486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 374901d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir final float horizontalPosFix = (float) Math.ceil( 375001d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir mTextView.getPaint().measureText("\u0635") * 2f / 3f); 375191f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingTop = mTextView.getTotalPaddingTop(); 375291f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir final int paddingRight = mTextView.getTotalPaddingRight(); 375391f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir 37546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at first line 37559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu float x = mTextView.getWidth() - 1f; 375691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir float y = lineBounds.height() / 2f + paddingTop; 37579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getOffsetForPosition(x, y)); 37586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at first line 37606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 37619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37626a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // update lineBounds to be the second line 37649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLayout().getLineBounds(1, lineBounds); 376591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir y = lineBounds.top + lineBounds.height() / 2f + paddingTop; 37666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // right edge of view at second line 37689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu x = mTextView.getWidth() - 1f; 37699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length(), mTextView.getOffsetForPosition(x, y)); 37706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // left edge of view at second line 37726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir x = 0f; 37739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 377591f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir // left edge of text at second line 377691f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getWidth() - (mTextView.getLayout().getLineWidth(1) + paddingRight 377701d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir - horizontalPosFix); 37789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + line.length() - 1, mTextView.getOffsetForPosition(x, y)); 37796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // horizontal center of text at second line 378191f03aedb667bbfeae3ffe57a41f0cb1a3fe9a00Siyamed Sinir x = mTextView.getWidth() - (mTextView.getLayout().getLineWidth(1) / 2f + paddingRight 378201d82d29ced4610fcda7c72918ce29a1dfe6f631Siyamed Sinir - horizontalPosFix); 37836beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // second line mid offset should not include next line, therefore subtract one 37849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(line.length() + (line.length() - 1) / 2, mTextView.getOffsetForPosition(x, y)); 37856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3788a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsFalseByDefault() { 3790a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 37926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 37936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 37946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 37959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3796a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 37976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testIsTextSelectable_returnsTrueIfSetTextIsSelectableCalledWithTrue() { 3798a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 37996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setText("any text"); 38006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 38016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 38026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 38036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 3805a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 38066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testSetIsTextSelectable() { 3807a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final TextView textView = new TextView(mActivity); 38086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isTextSelectable()); 38106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusable()); 38116a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isFocusableInTouchMode()); 38126a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isClickable()); 38136a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertFalse(textView.isLongClickable()); 38146a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38156a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setTextIsSelectable(true); 38166a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 38176a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isTextSelectable()); 38186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusable()); 38196a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isFocusableInTouchMode()); 38206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isClickable()); 38216a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertTrue(textView.isLongClickable()); 38226a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(textView.getMovementMethod()); 38236a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 3824f6d7a3822a73508d4bfeb0f21e1adb325a62fd18Siyamed Sinir 3825a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 38264b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessTransformationMethod() throws Throwable { 3827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the password attribute in xml 3828fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_password); 3829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3832fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3833fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check the singleLine attribute in xml 3834fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_singleLine); 3835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(mTextView); 3836fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(SingleLineTransformationMethod.getInstance(), 3837fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3838fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3839fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final QwertyKeyListener qwertyKeyListener = QwertyKeyListener.getInstance(false, 3840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Capitalize.NONE); 3841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final TransformationMethod method = PasswordTransformationMethod.getInstance(); 3842fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // change transformation method by function 38439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 38446beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setKeyListener(qwertyKeyListener); 38456beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTransformationMethod(method); 38466beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTransformedText = method.getTransformation(mTextView.getText(), mTextView); 3847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 38486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 3849fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 3850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3851fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(PasswordTransformationMethod.getInstance(), 3852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getTransformationMethod()); 3853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3854b6d441382890b4cd603124ee8dd0e7af3dca5454Andrei Stingaceanu CtsKeyEventUtil.sendKeys(mInstrumentation, mTextView, "H E 2*L O"); 38559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.append(" ")); 3856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3858354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // It will get transformed after a while 3859354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // We're waiting for transformation to "******" 3860354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov PollingCheck.waitFor(TIMEOUT, () -> mTransformedText.toString() 3861354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov .equals("\u2022\u2022\u2022\u2022\u2022\u2022")); 3862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3863fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set null 38649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTransformationMethod(null)); 3865fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 3866fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(mTextView.getTransformationMethod()); 3867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3868fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 3870a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 3871fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testCompound() { 3872fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 3873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int padding = 3; 3874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su Drawable[] drawables = mTextView.getCompoundDrawables(); 3875fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[0]); 3876fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[1]); 3877fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[2]); 3878fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3879fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3880fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test setCompoundDrawablePadding and getCompoundDrawablePadding 3881fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablePadding(padding); 3882fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(padding, mTextView.getCompoundDrawablePadding()); 3883fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3884fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using resid, 0 represents null 3885fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.start, R.drawable.pass, 3886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su R.drawable.failed, 0); 3887fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3888fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3889fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3890a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.start), 3891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[0]).getBitmap()); 3892fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3893a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.pass), 3894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[1]).getBitmap()); 3895fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3896a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov WidgetTestUtils.assertEquals(TestUtils.getBitmap(mActivity, R.drawable.failed), 3897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su ((BitmapDrawable) drawables[2]).getBitmap()); 3898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3900fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3901a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.blue); 3902a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3903a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // using drawables directly 3906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, null); 3907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3909fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3910fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3912fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3913fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3914fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3915fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3917fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getIntrinsicWidth(), 3920fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3921fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getIntrinsicHeight(), 3922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3923fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getIntrinsicWidth(), 3924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3926fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3927fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set bounds to drawables and set them again. 3928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 1, 2); 3929fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 3, 4); 3930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 5, 6); 3931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // usinf drawables 3932fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, top, right, null); 3933fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su drawables = mTextView.getCompoundDrawables(); 3934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3935fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableLeft 3936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(left, drawables[0]); 3937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableTop 3938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(top, drawables[1]); 3939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableRight 3940fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertSame(right, drawables[2]); 3941fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // drawableBottom 3942fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(drawables[3]); 3943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 3944fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // check compound padding 3945fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingLeft() + padding + left.getBounds().width(), 3946fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingLeft()); 3947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingTop() + padding + top.getBounds().height(), 3948fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingTop()); 3949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingRight() + padding + right.getBounds().width(), 3950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCompoundPaddingRight()); 3951fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getPaddingBottom(), mTextView.getCompoundPaddingBottom()); 3952fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 3953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 39546a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir @UiThreadTest 3955a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 39566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetCompoundDrawablesRelative() { 39576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare textview 39586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView = new TextView(mActivity); 39596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir // prepare drawables 3961a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable start = TestUtils.getDrawable(mActivity, R.drawable.blue); 3962a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable end = TestUtils.getDrawable(mActivity, R.drawable.yellow); 3963a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 3964a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.black); 39656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(start); 39666a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(end); 39676a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(top); 39686a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(bottom); 39696a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39706a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir Drawable[] drawables = mTextView.getCompoundDrawablesRelative(); 39716a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39726a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 39746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 39756a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 39766a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 39776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 39796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39856a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39866a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39876a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39886a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39896a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 39906a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(start, top, end, bottom); 39916a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 39926a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 39936a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 39946a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 39956a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(start, drawables[0]); 39966a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(top, drawables[1]); 39976a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(end, drawables[2]); 39986a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertSame(bottom, drawables[3]); 39996a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 40006a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.setCompoundDrawablesRelative(null, null, null, null); 40016a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir drawables = mTextView.getCompoundDrawablesRelative(); 40026a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 40036a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNotNull(drawables); 40046a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(4, drawables.length); 40056a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[0]); 40066a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[1]); 40076a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[2]); 40086a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertNull(drawables[3]); 40096a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 40106a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 4011a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 40124b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSingleLine() throws Throwable { 40139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 40149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 40159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 40169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu setSpannableText(mTextView, "This is a really long sentence" 4017013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu + " which can not be placed in one line on the screen."); 4018013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 4019013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu // Narrow layout assures that the text will get wrapped. 40206a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final FrameLayout innerLayout = new FrameLayout(mActivity); 4021013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu innerLayout.setLayoutParams(new ViewGroup.LayoutParams(100, 100)); 40229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu innerLayout.addView(mTextView); 4023013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 4024013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 4025013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu layout.addView(innerLayout); 4026013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu 40279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 40286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(layout); 40299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(true); 4030013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu }); 4031013d5ee5428a0fde1cbe1befa4587b0d7a5e39c1Brian Muramatsu mInstrumentation.waitForIdleSync(); 4032fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4033fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 40349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 4035da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 4036da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineWidth = 0; 4037da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu int singleLineHeight = 0; 4038da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 40399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 40409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineWidth = mTextView.getLayout().getWidth(); 40419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu singleLineHeight = mTextView.getLayout().getHeight(); 4042da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4043fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 40449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setSingleLine(false)); 4045fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 40469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(null, mTextView.getTransformationMethod()); 4047da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 40489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 40499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getHeight() > singleLineHeight); 40509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getLayout().getWidth() < singleLineWidth); 4051da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4052fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // same behaviours as setSingLine(true) 40549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(mTextView::setSingleLine); 4055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(SingleLineTransformationMethod.getInstance(), 40579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getTransformationMethod()); 4058da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu 40599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu if (mTextView.getLayout() != null) { 40609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineHeight, mTextView.getLayout().getHeight()); 40619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(singleLineWidth, mTextView.getLayout().getWidth()); 4062da492b574cec4f919a3952d3e03b098e7eb01ffeWei Liu } 4063fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4066a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 406798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testAccessMaxLines() { 4068fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 40696031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) (mTextView.getPaint().measureText(LONG_TEXT) / 4)); 4070fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(LONG_TEXT); 4071fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4072fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su final int maxLines = 2; 4073fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > maxLines); 4074fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4075fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setMaxLines(maxLines); 4076fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.requestLayout(); 4077fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 407898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(2, mTextView.getMaxLines()); 407998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMaxHeight()); 4080fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getHeight() <= maxLines * mTextView.getLineHeight()); 4081fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4082fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4083636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4084a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4085636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_frequencyNone() { 4086636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] BREAK_STRATEGIES = { 4087636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_SIMPLE, Layout.BREAK_STRATEGY_HIGH_QUALITY, 4088636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.BREAK_STRATEGY_BALANCED }; 4089636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4090636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4091636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4092636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int breakStrategy : BREAK_STRATEGIES) { 4093636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4094636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 40956031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 40966031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4097636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4098636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4099636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(breakStrategy); 4100636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4101636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 4102636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4103636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4104636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4105636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4106636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4107636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4108636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4109636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4110636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any break strategy, hyphenation should not happen if 4111636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // HYPHENATION_FREQUENCY_NONE is specified. 4112636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4113636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4114636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4115636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4116636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4117636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4118636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4119636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka @UiThreadTest 4120a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4121636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka public void testHyphenationNotHappen_breakStrategySimple() { 4122636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int[] HYPHENATION_FREQUENCIES = { 4123636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, 4124636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout.HYPHENATION_FREQUENCY_NONE }; 4125636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4126636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView = findTextView(R.id.textview_text); 4127636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4128636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int hyphenationFrequency: HYPHENATION_FREQUENCIES) { 4129636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int charWidth = 10; charWidth < 120; charWidth += 5) { 4130636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // Change the text view's width to charWidth width. 41316031df7acadcd35236309edcbb046847735bda65Siyamed Sinir final String substring = LONG_TEXT.substring(0, charWidth); 41326031df7acadcd35236309edcbb046847735bda65Siyamed Sinir mTextView.setWidth((int) Math.ceil(mTextView.getPaint().measureText(substring))); 4133636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4134636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setText(LONG_TEXT); 4135636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 4136636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4137636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.setHyphenationFrequency(hyphenationFrequency); 4138636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4139636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.requestLayout(); 4140636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka mTextView.onPreDraw(); // For freezing the layout. 4141636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Layout layout = mTextView.getLayout(); 4142636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4143636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineCount = layout.getLineCount(); 4144636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka for (int line = 0; line < lineCount; ++line) { 4145636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka final int lineEnd = layout.getLineEnd(line); 4146636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // In any width, any hyphenation frequency, hyphenation should not happen if 4147636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka // BREAK_STRATEGY_SIMPLE is specified. 4148636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka assertTrue(lineEnd == LONG_TEXT.length() || 4149636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka Character.isWhitespace(LONG_TEXT.charAt(lineEnd - 1))); 4150636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4151636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4152636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4153636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka } 4154636e9b2547b13f54b22ffd1451d5625a5183a4cdSeigo Nonaka 4155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4156a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4157fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetMaxLinesException() { 415872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 415972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 4160fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(mTextView.getWidth() >> 3); 416172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setMaxLines(-1); 4162fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4164a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41654b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessMinLines() throws Throwable { 4166fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4167fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines - 1); 4171fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 417298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines - 1, mTextView.getMinLines()); 417398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setMinLines(originalLines + 1); 4176fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 417798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(originalLines + 1, mTextView.getMinLines()); 417898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(-1, mTextView.getMinHeight()); 4179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4181a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 41824b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetLines() throws Throwable { 4183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make it multiple lines 4185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 3); 4186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int originalLines = mTextView.getLineCount(); 4187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines - 1); 4189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines - 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(originalLines + 1); 4192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue((originalLines + 1) * mTextView.getLineHeight() <= mTextView.getHeight()); 4193fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4194fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4196a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetLinesException() { 419872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 419972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mActivity.setContentView(mTextView); 420072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setWidth(mTextView.getWidth() >> 3); 420172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setLines(-1); 4202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4203fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4204fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4205a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingTop() { 4207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4208fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4209fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingTop()); 4210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4212a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4213fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 4214fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, top, null, null); 4215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingTop(), mTextView.getExtendedPaddingTop()); 4216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4218fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4219fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.BOTTOM); 4220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingTop() > 0); 4222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4223fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4224fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4225a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetExtendedPaddingBottom() { 4227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4228fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4229fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getExtendedPaddingBottom()); 4230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4232a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4233fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 4234fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, null, bottom); 4235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingBottom(), mTextView.getExtendedPaddingBottom()); 4236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4238fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setLines(mTextView.getLineCount() - 1); 4239fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_VERTICAL); 4240fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4241fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getExtendedPaddingBottom() > 0); 4242fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4243fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4244a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 42454b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingTop() throws Throwable { 4246fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4247fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4248fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingTop()); 4249fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4250fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4251a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable top = TestUtils.getDrawable(mActivity, R.drawable.red); 4252fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su top.setBounds(0, 0, 100, 10); 42539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 42546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, top, null, null); 42556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 42566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.BOTTOM); 4257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingTop(), mTextView.getTotalPaddingTop()); 4260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = mTextView.getHeight() 4264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineTop(mTextView.getLineCount()); 4266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingTop()); 4267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4269a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 42704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetTotalPaddingBottom() throws Throwable { 4271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingBottom()); 4274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4276a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov final Drawable bottom = TestUtils.getDrawable(mActivity, R.drawable.red); 4277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su bottom.setBounds(0, 0, 100, 10); 42789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 42796beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setCompoundDrawables(null, null, null, bottom); 42806beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setLines(mTextView.getLineCount() - 1); 42816beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setGravity(Gravity.CENTER_VERTICAL); 4282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }); 4283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getExtendedPaddingBottom(), mTextView.getTotalPaddingBottom()); 4285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change line count 4287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setLines(mTextView.getLineCount() + 1); 4288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su int expected = ((mTextView.getHeight() 4289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingBottom() 4290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getExtendedPaddingTop() 4291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su - mTextView.getLayout().getLineBottom(mTextView.getLineCount())) >> 1) 4292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su + mTextView.getExtendedPaddingBottom(); 4293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(expected, mTextView.getTotalPaddingBottom()); 4294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4297a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingLeft() { 4299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingLeft()); 4302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4304a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable left = TestUtils.getDrawable(mActivity, R.drawable.red); 4305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su left.setBounds(0, 0, 10, 100); 4306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(left, null, null, null); 4307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.RIGHT); 4308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingLeft(), mTextView.getTotalPaddingLeft()); 4313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su @UiThreadTest 4316a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetTotalPaddingRight() { 4318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Initialized value 4320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getTotalPaddingRight()); 4321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // After Set a Drawable 4323a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable right = TestUtils.getDrawable(mActivity, R.drawable.red); 4324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su right.setBounds(0, 0, 10, 100); 4325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setCompoundDrawables(null, null, right, null); 4326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setGravity(Gravity.CENTER_HORIZONTAL); 4327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // Change width 4330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setWidth(Integer.MAX_VALUE); 4331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mTextView.getCompoundPaddingRight(), mTextView.getTotalPaddingRight()); 4332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4335a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetUrls() { 4337fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4338fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4339fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su URLSpan[] spans = mTextView.getUrls(); 4340fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, spans.length); 4341fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4342fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String url = "http://www.google.com"; 4343fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String email = "name@gmail.com"; 4344fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su String string = url + " mailto:" + email; 4345fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su SpannableString spannable = new SpannableString(string); 4346fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(url), 0, url.length(), 0); 4347fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4348fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4349fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, spans.length); 4350fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4351fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4352fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new URLSpan(email), 0, email.length(), 0); 4353fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4354fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4355fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4356fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4357fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(url, spans[0].getURL()); 4358fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(email, spans[1].getURL()); 4359fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4360fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test the situation that param what is not a URLSpan 4361fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spannable.setSpan(new Object(), 0, 9, 0); 4362fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setText(spannable, BufferType.SPANNABLE); 4363fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su spans = mTextView.getUrls(); 4364fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, spans.length); 4365fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4368a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4369fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetPadding() { 4370fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4371fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4372fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(0, 1, 2, 4); 4373fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(0, mTextView.getPaddingLeft()); 4374fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getPaddingTop()); 4375fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(2, mTextView.getPaddingRight()); 4376fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(4, mTextView.getPaddingBottom()); 4377fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4378fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setPadding(10, 20, 30, 40); 4379fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(10, mTextView.getPaddingLeft()); 4380fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20, mTextView.getPaddingTop()); 4381fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(30, mTextView.getPaddingRight()); 4382fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(40, mTextView.getPaddingBottom()); 4383fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4384fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 43859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4386a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4387c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testBaselineAttributes() { 4388c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = findTextView(R.id.textview_baseline); 4389c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4390c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int firstBaselineToTopHeight = mTextView.getResources() 4391c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki .getDimensionPixelSize(R.dimen.textview_firstBaselineToTopHeight); 4392c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int lastBaselineToBottomHeight = mTextView.getResources() 4393c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki .getDimensionPixelSize(R.dimen.textview_lastBaselineToBottomHeight); 4394c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int lineHeight = mTextView.getResources() 4395c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki .getDimensionPixelSize(R.dimen.textview_lineHeight); 4396c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4397c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(firstBaselineToTopHeight, mTextView.getFirstBaselineToTopHeight()); 4398c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lastBaselineToBottomHeight, mTextView.getLastBaselineToBottomHeight()); 4399c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lineHeight, mTextView.getLineHeight()); 4400c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4401c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4402c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4403c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4404c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetFirstBaselineToTopHeight() { 4405c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = new TextView(mActivity); 4406c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setText("This is some random text"); 4407c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int padding = 100; 4408c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4409c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4410c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final FontMetricsInt fontMetrics = mTextView.getPaint().getFontMetricsInt(); 4411c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int fontMetricsTop = Math.max( 4412c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki Math.abs(fontMetrics.top), Math.abs(fontMetrics.ascent)); 4413c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4414c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki int firstBaselineToTopHeight = fontMetricsTop + 10; 4415c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setFirstBaselineToTopHeight(firstBaselineToTopHeight); 4416c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(firstBaselineToTopHeight, mTextView.getFirstBaselineToTopHeight()); 4417c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(padding, mTextView.getPaddingTop()); 4418c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4419c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki firstBaselineToTopHeight = fontMetricsTop + 40; 4420c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setFirstBaselineToTopHeight(firstBaselineToTopHeight); 4421c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(firstBaselineToTopHeight, mTextView.getFirstBaselineToTopHeight()); 4422c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4423c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4424c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(padding, mTextView.getPaddingTop()); 4425c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4426c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4427c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4428c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4429c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetFirstBaselineToTopHeight_tooSmall() { 4430c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = new TextView(mActivity); 4431c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setText("This is some random text"); 4432c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int padding = 100; 4433c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4434c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4435c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final FontMetricsInt fontMetrics = mTextView.getPaint().getFontMetricsInt(); 4436c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int fontMetricsTop = Math.min( 4437c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki Math.abs(fontMetrics.top), Math.abs(fontMetrics.ascent)); 4438c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4439c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki int firstBaselineToTopHeight = fontMetricsTop - 1; 4440c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setFirstBaselineToTopHeight(firstBaselineToTopHeight); 4441c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(firstBaselineToTopHeight, mTextView.getFirstBaselineToTopHeight()); 4442c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(padding, mTextView.getPaddingTop()); 4443c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4444c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4445c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4446c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test(expected = IllegalArgumentException.class) 4447c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetFirstBaselineToTopHeight_negative() { 4448c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki new TextView(mActivity).setFirstBaselineToTopHeight(-1); 4449c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4450c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4451c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4452c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4453c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetLastBaselineToBottomHeight() { 4454c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = new TextView(mActivity); 4455c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setText("This is some random text"); 4456c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int padding = 100; 4457c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4458c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4459c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final FontMetricsInt fontMetrics = mTextView.getPaint().getFontMetricsInt(); 4460c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int fontMetricsBottom = Math.max( 4461c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki Math.abs(fontMetrics.bottom), Math.abs(fontMetrics.descent)); 4462c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4463c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki int lastBaselineToBottomHeight = fontMetricsBottom + 20; 4464c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLastBaselineToBottomHeight(lastBaselineToBottomHeight); 4465c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lastBaselineToBottomHeight, mTextView.getLastBaselineToBottomHeight()); 4466c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(padding, mTextView.getPaddingBottom()); 4467c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4468c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki lastBaselineToBottomHeight = fontMetricsBottom + 30; 4469c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLastBaselineToBottomHeight(lastBaselineToBottomHeight); 4470c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lastBaselineToBottomHeight, mTextView.getLastBaselineToBottomHeight()); 4471c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4472c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4473c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(padding, mTextView.getPaddingBottom()); 4474c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4475c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4476c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4477c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4478c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetLastBaselineToBottomHeight_tooSmall() { 4479c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = new TextView(mActivity); 4480c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setText("This is some random text"); 4481c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int padding = 100; 4482c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setPadding(padding, padding, padding, padding); 4483c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4484c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final FontMetricsInt fontMetrics = mTextView.getPaint().getFontMetricsInt(); 4485c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final int fontMetricsBottom = Math.min( 4486c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki Math.abs(fontMetrics.bottom), Math.abs(fontMetrics.descent)); 4487c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4488c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki int lastBaselineToBottomHeight = fontMetricsBottom - 1; 4489c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLastBaselineToBottomHeight(lastBaselineToBottomHeight); 4490c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(lastBaselineToBottomHeight, mTextView.getLastBaselineToBottomHeight()); 4491c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(padding, mTextView.getPaddingBottom()); 4492c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4493c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4494c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4495c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test(expected = IllegalArgumentException.class) 4496c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetLastBaselineToBottomHeight_negative() { 4497c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki new TextView(mActivity).setLastBaselineToBottomHeight(-1); 4498c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4499c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4500c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4501c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4502c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetLineHeight() { 4503c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView = new TextView(mActivity); 4504c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setText("This is some random text"); 4505c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final float lineSpacingExtra = 50; 4506c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki final float lineSpacingMultiplier = 0.2f; 4507c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLineSpacing(lineSpacingExtra, lineSpacingMultiplier); 4508c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4509c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLineHeight(100); 4510c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(100, mTextView.getLineHeight()); 4511c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(lineSpacingExtra, mTextView.getLineSpacingExtra(), 0); 4512c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertNotEquals(lineSpacingMultiplier, mTextView.getLineSpacingMultiplier(), 0); 4513c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4514c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLineHeight(200); 4515c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(200, mTextView.getLineHeight()); 4516c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4517c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki mTextView.setLineSpacing(lineSpacingExtra, lineSpacingMultiplier); 4518c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lineSpacingExtra, mTextView.getLineSpacingExtra(), 0); 4519c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki assertEquals(lineSpacingMultiplier, mTextView.getLineSpacingMultiplier(), 0); 4520c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4521c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4522c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4523c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test(expected = IllegalArgumentException.class) 4524c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki public void testSetLineHeight_negative() { 4525c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki new TextView(mActivity).setLineHeight(-1); 4526c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki } 4527c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki 4528c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @UiThreadTest 4529c3cceb0e69b2d9554070b0aa8c5f99a4d7145a18Abodunrinwa Toki @Test 4530fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testDeprecatedSetTextAppearance() { 4531fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = new TextView(mActivity); 4532fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4533fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_All); 4534fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4535fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4536fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(20f, mTextView.getTextSize(), 0.01f); 4537fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4538fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.red), 4539fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4540fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4541fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4542fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4543fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Colors); 4544fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.black), 4545fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentTextColor()); 4546fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4547fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getCurrentHintTextColor()); 4548fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4549fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.getLinkTextColors().getDefaultColor()); 4550fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4551fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_NotColors); 4552fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(17f, mTextView.getTextSize(), 0.01f); 4553fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4554fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4555fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView.setTextAppearance(mActivity, R.style.TextAppearance_Style); 4556fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(null, mTextView.getTypeface()); 4557fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4558fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 45599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4560a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4561fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testSetTextAppearance() { 4562fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4563fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4564fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_All); 4565fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4566fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4567fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(20f, mTextView.getTextSize(), 0.01f); 4568fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4569fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.red), 4570fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4571fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4572fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 45736a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 45746a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4575fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4576fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Colors); 4577fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.black), 4578fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentTextColor()); 4579fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4580fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getCurrentHintTextColor()); 4581fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(mActivity.getResources().getColor(R.drawable.yellow), 4582fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.getLinkTextColors().getDefaultColor()); 45836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(mActivity.getResources().getColor(R.drawable.red), 45846a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mTextView.getHighlightColor()); 4585fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4586fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_NotColors); 4587fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(17f, mTextView.getTextSize(), 0.01f); 4588fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(Typeface.NORMAL, mTextView.getTypeface().getStyle()); 4589fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4590fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setTextAppearance(R.style.TextAppearance_Style); 4591fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(null, mTextView.getTypeface()); 4592fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4593fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4594f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri @Test 4595f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri public void testXmlTextAppearance() { 4596f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs1); 4597f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(22f, mTextView.getTextSize(), 0.01f); 4598f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri Typeface italicSans = Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC); 4599f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(italicSans, mTextView.getTypeface()); 4600f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(Typeface.ITALIC, mTextView.getTypeface().getStyle()); 4601f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertTrue(mTextView.isAllCaps()); 4602f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(2.4f, mTextView.getLetterSpacing(), 0.01f); 4603f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals("smcp", mTextView.getFontFeatureSettings()); 4604f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 4605f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs2); 4606f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(Typeface.MONOSPACE, mTextView.getTypeface()); 4607f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(mActivity.getResources().getColor(R.drawable.red), 4608f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView.getShadowColor()); 4609f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(10.3f, mTextView.getShadowDx(), 0.01f); 4610f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(0.5f, mTextView.getShadowDy(), 0.01f); 4611f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(3.3f, mTextView.getShadowRadius(), 0.01f); 4612f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertTrue(mTextView.isElegantTextHeight()); 4613f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 4614f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri // This TextView has both a TextAppearance and a style, so the style should override. 4615f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs3); 4616f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(32f, mTextView.getTextSize(), 0.01f); 4617f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri Typeface boldSerif = Typeface.create(Typeface.SERIF, Typeface.BOLD); 4618f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(boldSerif, mTextView.getTypeface()); 4619f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4620f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertFalse(mTextView.isAllCaps()); 4621f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(2.6f, mTextView.getLetterSpacing(), 0.01f); 4622f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4623f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView.getShadowColor()); 4624f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(1.3f, mTextView.getShadowDx(), 0.01f); 4625f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(10.5f, mTextView.getShadowDy(), 0.01f); 4626f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(5.3f, mTextView.getShadowRadius(), 0.01f); 4627f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertFalse(mTextView.isElegantTextHeight()); 4628f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 4629f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri // This TextView has no TextAppearance and has a style, so the style should be applied. 4630f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs4); 4631f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(32f, mTextView.getTextSize(), 0.01f); 4632f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(boldSerif, mTextView.getTypeface()); 4633f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(Typeface.BOLD, mTextView.getTypeface().getStyle()); 4634f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertFalse(mTextView.isAllCaps()); 4635f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(2.6f, mTextView.getLetterSpacing(), 0.01f); 4636f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(mActivity.getResources().getColor(R.drawable.blue), 4637f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView.getShadowColor()); 4638f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(1.3f, mTextView.getShadowDx(), 0.01f); 4639f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(10.5f, mTextView.getShadowDy(), 0.01f); 4640f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertEquals(5.3f, mTextView.getShadowRadius(), 0.01f); 4641f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertFalse(mTextView.isElegantTextHeight()); 4642f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 4643f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri // Note: text, link and hint colors can't be tested due to the default style overriding 4644f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri // values b/63923542 4645f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri } 4646f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 4647f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri @Test 4648af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri public void testXmlTypefaceFontFamilyHierarchy() { 4649af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri // This view has typeface=serif set on the view directly and a fontFamily on the appearance. 4650af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri // In this case, the attr set directly on the view should take precedence. 4651af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs_serif_fontfamily); 4652af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri 4653af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri assertEquals(Typeface.SERIF, mTextView.getTypeface()); 4654af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri } 4655af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri 4656af591c1d2bf893be7b3cbc672005d453a6c928d0Clara Bayarri @Test 4657f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri public void testAttributeReading_allCapsAndPassword() { 4658f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri // This TextView has all caps & password, therefore all caps should be ignored. 4659f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri mTextView = findTextView(R.id.textview_textappearance_attrs_allcaps_password); 4660f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri assertFalse(mTextView.isAllCaps()); 4661f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri } 4662f86dd6ea7b0876fa61070b244dd25eba4902cd1bClara Bayarri 46639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4664a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4665fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai public void testAccessCompoundDrawableTint() { 4666fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView = new TextView(mActivity); 4667fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4668fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai ColorStateList colors = ColorStateList.valueOf(Color.RED); 4669fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintList(colors); 4670fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai mTextView.setCompoundDrawableTintMode(PorterDuff.Mode.XOR); 4671fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertSame(colors, mTextView.getCompoundDrawableTintList()); 4672fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4673f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4674f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette // Ensure the tint is preserved across drawable changes. 4675f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawablesRelative(null, null, null, null); 4676f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4677f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4678f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4679f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(null, null, null, null); 4680f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4681f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4682f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette 4683f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr1 = new ColorDrawable(Color.RED); 4684f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr2 = new ColorDrawable(Color.GREEN); 4685f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr3 = new ColorDrawable(Color.BLUE); 4686f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette ColorDrawable dr4 = new ColorDrawable(Color.YELLOW); 4687f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette mTextView.setCompoundDrawables(dr1, dr2, dr3, dr4); 4688f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertSame(colors, mTextView.getCompoundDrawableTintList()); 4689f7773bad2586cf5562f81e49ad5353396744542eAlan Viverette assertEquals(PorterDuff.Mode.XOR, mTextView.getCompoundDrawableTintMode()); 4690fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai } 4691fc8d65e3fed8c61cd1cb442ecafc24ecf2a9a56bJun Mukai 4692a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 46934b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetHorizontallyScrolling() throws Throwable { 4694fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the text view has more than one line 4695fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = findTextView(R.id.textview_text); 4696fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setWidth(mTextView.getWidth() >> 1); 4697fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4698fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4699fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(true); 4700fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(1, mTextView.getLineCount()); 4701fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4702fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su setHorizontallyScrolling(false); 4703fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(mTextView.getLineCount() > 1); 4704fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4705fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4706a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 47079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeHorizontalScrollRange() throws Throwable { 47089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 47099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4710fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 47119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 47129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 47139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4714fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 47169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 47179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getWidth(), 47189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4719fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4720fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // set the layout 47219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 47229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getWidth(), 47239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeHorizontalScrollRange()); 4724fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4725fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4726a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 47279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testComputeVerticalScrollRange() throws Throwable { 47289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new MockTextView(mActivity)); 47299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 47309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 4731fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // test when layout is null 47329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getLayout()); 47339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollRange()); 4734fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> ((MockTextView) mTextView).setFrame(0, 0, 40, 50)); 47369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 47379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getHeight(), ((MockTextView) mTextView).computeVerticalScrollRange()); 4738fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4739fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //set the layout 47409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout(mTextView); 47419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(mTextView.getLayout().getHeight(), 47429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mTextView).computeVerticalScrollRange()); 4743fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4744fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4745a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 47469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testDrawableStateChanged() throws Throwable { 47479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new MockTextView(mActivity))); 47489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 47499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 47509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.refreshDrawableState(); 47519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) verify(mTextView, times(1))).drawableStateChanged(); 4752fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4753fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4755a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4756fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultEditable() { 47579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 4758fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4759fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultEditable() does nothing, and always return false. 47609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView) mTextView).getDefaultEditable()); 4761fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4762fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4764a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4765fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testGetDefaultMovementMethod() { 4766fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4767fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4768fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //the TextView#getDefaultMovementMethod() does nothing, and always return null. 4769fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNull(textView.getDefaultMovementMethod()); 4770fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4771fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 47729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4773a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4774fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testSetFrame() { 4775fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su MockTextView textView = new MockTextView(mActivity); 4776fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4777fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a new size to this view 4778fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(0, 0, 320, 480)); 4779b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getLeft()); 4780b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(0, textView.getTop()); 4781b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(320, textView.getRight()); 4782b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(480, textView.getBottom()); 4783fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4784fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //Assign a same size to this view 4785fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(textView.setFrame(0, 0, 320, 480)); 4786fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4787fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su //negative input 4788fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(textView.setFrame(-1, -1, -1, -1)); 4789b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getLeft()); 4790b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getTop()); 4791b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getRight()); 4792b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir assertEquals(-1, textView.getBottom()); 4793fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4794fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4795a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 47964b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testMarquee() throws Throwable { 4797354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // Both are pointing to the same object. This works around current limitation in CTS 4798354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov // coverage report tool for properly reporting coverage of base class method calls. 47999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 48009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mSecondTextView = new MockTextView(mActivity); 4801354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 48029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = mSecondTextView; 48039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(LONG_TEXT); 48049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 48059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setEllipsize(TruncateAt.MARQUEE); 48069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setLayoutParams(new LayoutParams(100, 100)); 48079560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 48089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 4809bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4810bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu final FrameLayout layout = new FrameLayout(mActivity); 48119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView); 4812bed9d222439713a766c3d5c91fae1526b5bc35dcBrian Muramatsu 4813fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // make the fading to be shown 48149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setHorizontalFadingEdgeEnabled(true); 4815fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 4817fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4818fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu TestSelectedRunnable runnable = new TestSelectedRunnable(mTextView) { 4820fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 48219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(-1); 4822fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to start 4823fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 48249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(true); 4825fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 4826fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4827fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 48289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4829fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4830fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // wait for the marquee to run 4831fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // fading is shown on both sides if the marquee runs for a while 48329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 48339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f 48349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu && ((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4835fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48360f095ca986d7558f9f5260c71a12cef4474d9da3Siyamed Sinir // wait for left marquee to fully apply 48379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu PollingCheck.waitFor(TIMEOUT, () -> 48389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.99f); 4839354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 4840fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected1()); 4841fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected2()); 48429560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(-1, mTextView.getMarqueeRepeatLimit()); 4843fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu runnable = new TestSelectedRunnable(mTextView) { 4845fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void run() { 48469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMarqueeRepeatLimit(0); 4847fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 4848fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected1(); 48499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSelected(false); 4850fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su saveIsSelected2(); 48519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setGravity(Gravity.LEFT); 4852fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4853fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su }; 4854fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // force the marquee to stop 48559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(runnable); 4856fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4857fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(runnable.getIsSelected1()); 4858fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertFalse(runnable.getIsSelected2()); 48599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 48609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 48619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, mTextView.getMarqueeRepeatLimit()); 4862fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.RIGHT)); 4864fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 48659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getLeftFadingEdgeStrength() > 0.0f); 48669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getRightFadingEdgeStrength(), 0.01f); 4867fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setGravity(Gravity.CENTER_HORIZONTAL)); 4869fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 4870fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // there is no left fading (Is it correct?) 48719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0.0f, ((MockTextView) mSecondTextView).getLeftFadingEdgeStrength(), 0.01f); 48729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView) mSecondTextView).getRightFadingEdgeStrength() > 0.0f); 4873fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4874fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 48759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4876a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 48776a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testGetMarqueeRepeatLimit() { 48786a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir final TextView textView = new TextView(mActivity); 48796a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48806a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir textView.setMarqueeRepeatLimit(10); 48816a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir assertEquals(10, textView.getMarqueeRepeatLimit()); 48826a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 48836a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 48849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4885a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4886fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessInputExtras() throws XmlPullParserException, IOException { 48879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 48889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 48899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT); 4890fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4891fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // do not create the extras 48929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getInputExtras(false)); 4893fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4894fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // create if it does not exist 48959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu Bundle inputExtras = mTextView.getInputExtras(true); 4896fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertNotNull(inputExtras); 4897fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertTrue(inputExtras.isEmpty()); 4898fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4899fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su // it is created already 49009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNotNull(mTextView.getInputExtras(false)); 4901fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 4902fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su try { 49039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputExtras(R.xml.input_extras); 4904fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su fail("Should throw NullPointerException!"); 4905fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } catch (NullPointerException e) { 4906fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4907fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4908fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4910a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4911fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessContentType() { 49129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 49139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 49149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 49159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4916fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4918fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4919fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 49209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 49219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateTimeKeyListener); 4922fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49239560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4924fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 4925fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 49269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 49279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DateKeyListener); 4928fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_DATETIME 4930fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 4931fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 49329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 49339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TimeKeyListener); 4934fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_NUMBER 4936fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 4937fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 4938fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 4939fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 49409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 494173eaebf6dc49e5db83438be84bce12579fe94c94Roozbeh Pournader assertSame(mTextView.getKeyListener(), 49424e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader DigitsKeyListener.getInstance(null, true, true)); 4943fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_PHONE); 49459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 49469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof DialerKeyListener); 4947fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4949fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 4950fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 49519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 49529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), TextKeyListener.getInstance(true, Capitalize.NONE)); 4953fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 49559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 49569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4957fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 4958fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 4959fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 4960fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 49619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 49629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4963fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.CHARACTERS)); 49649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 4965fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4967fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 4968fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 49699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 49709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4971fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.WORDS)); 49729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 4973fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_CLASS_TEXT 4975fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 4976fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 49779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 49789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertSame(mTextView.getKeyListener(), 4979fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su TextKeyListener.getInstance(false, Capitalize.SENTENCES)); 4980fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setInputType(InputType.TYPE_NULL); 49829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_NULL, mTextView.getInputType()); 49839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getKeyListener() instanceof TextKeyListener); 4984fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 4985fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 4987a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 4988fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void testAccessRawContentType() { 49899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 49909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(null, BufferType.EDITABLE); 49919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(null); 49929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setTransformationMethod(null); 4993fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 49949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 4995fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_NORMAL); 4996fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 49979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_NORMAL, mTextView.getInputType()); 49989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 49999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5000fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 5002fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_DATE); 5003fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 50049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_DATE, mTextView.getInputType()); 50059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 50069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5007fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50089560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_DATETIME 5009fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_DATETIME_VARIATION_TIME); 5010fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_DATETIME 50119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_DATETIME_VARIATION_TIME, mTextView.getInputType()); 50129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 50139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5014fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_NUMBER 5016fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 5017fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_SIGNED); 5018fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_NUMBER 5019fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_NUMBER_FLAG_DECIMAL 50209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_NUMBER_FLAG_SIGNED, mTextView.getInputType()); 50219560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 50229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5023fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_PHONE); 50259560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(InputType.TYPE_CLASS_PHONE, mTextView.getInputType()); 50269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 50279560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5028fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 5030fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); 5031fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 50329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT, mTextView.getInputType()); 50339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getTransformationMethod()); 50349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5035fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setSingleLine(); 50379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 50389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 5039fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 5040fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS); 5041fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 5042fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_MULTI_LINE 50439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS, mTextView.getInputType()); 50449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 50459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5046fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 5048fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_WORDS); 5049fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 50509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_WORDS, mTextView.getInputType()); 50519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 50529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5053fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_CLASS_TEXT 5055fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES); 5056fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su assertEquals(InputType.TYPE_CLASS_TEXT 50579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES, mTextView.getInputType()); 50589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 50599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5060fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setRawInputType(InputType.TYPE_NULL); 50629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.getTransformationMethod() instanceof SingleLineTransformationMethod); 50639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertNull(mTextView.getKeyListener()); 5064fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 5065fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 50669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5067a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 506872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testVerifyDrawable() { 50699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 507072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5071a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 50729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertFalse(((MockTextView ) mTextView).verifyDrawable(d)); 507372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 50749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, null); 50759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(((MockTextView ) mTextView).verifyDrawable(d)); 507672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 507772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5078a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 507972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessPrivateImeOptions() { 508072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 508172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 508272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 508372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions("com.example.myapp.SpecialMode=3"); 508472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("com.example.myapp.SpecialMode=3", mTextView.getPrivateImeOptions()); 508572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 508672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setPrivateImeOptions(null); 508772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getPrivateImeOptions()); 508872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 508972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5090a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 509172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetOnEditorActionListener() { 509272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 509372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 509498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView.OnEditorActionListener mockOnEditorActionListener = 509598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mock(TextView.OnEditorActionListener.class); 509698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 509772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 509898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setOnEditorActionListener(mockOnEditorActionListener); 509998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verifyZeroInteractions(mockOnEditorActionListener); 510072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 510172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.onEditorAction(EditorInfo.IME_ACTION_DONE); 510298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockOnEditorActionListener, times(1)).onEditorAction(mTextView, 510398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov EditorInfo.IME_ACTION_DONE, null); 510472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 510572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5106a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 510772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeOptions() { 510872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 510972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 511072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_GO); 511272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_GO, mTextView.getImeOptions()); 511372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_ACTION_DONE); 511572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_ACTION_DONE, mTextView.getImeOptions()); 511672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 511772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeOptions(EditorInfo.IME_NULL); 511872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(EditorInfo.IME_NULL, mTextView.getImeOptions()); 511972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 512072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5121a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 512272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testAccessImeActionLabel() { 512372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 512472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertNull(mTextView.getImeActionLabel()); 512572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getImeActionId()); 512672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 512772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setImeActionLabel("pinyin", 1); 512872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("pinyin", mTextView.getImeActionLabel().toString()); 512972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(1, mTextView.getImeActionId()); 513072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 513172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 51329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5133a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5134d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa public void testAccessImeHintLocales() { 5135d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final TextView textView = new TextView(mActivity); 5136d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setText("", BufferType.EDITABLE); 5137d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setKeyListener(null); 5138d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setRawInputType(InputType.TYPE_CLASS_TEXT); 5139d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(textView.getImeHintLocales()); 5140d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 5141d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 5142d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 5143d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertNull(editorInfo.hintLocales); 5144d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 5145d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 5146d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final LocaleList localeList = LocaleList.forLanguageTags("en-PH,en-US"); 5147d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.setImeHintLocales(localeList); 5148d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, textView.getImeHintLocales()); 5149d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa { 5150d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa final EditorInfo editorInfo = new EditorInfo(); 5151d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa textView.onCreateInputConnection(editorInfo); 5152d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa assertEquals(localeList, editorInfo.hintLocales); 5153d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 5154d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa } 5155d14d9c9a3d9d8eeed720ecf28716fc51942c096aYohei Yukawa 5156c873101a88e7ba584065de5e912508237378ca99Victoria Lease @UiThreadTest 5157a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 51584e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesChangesInputType() { 51594e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 51604e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 51614e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51624e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(InputType.TYPE_CLASS_NUMBER); 51634e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(InputType.TYPE_CLASS_NUMBER, textView.getInputType()); 51644e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51654e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final LocaleList localeList = LocaleList.forLanguageTags("fa-IR"); 51664e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(localeList); 51674e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL; 51684e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting IME hint locales to Persian must change the input type to a full text IME, 51694e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // since the typical number input IME may not have localized digits. 51704e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 51714e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51724e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to datetime should keep the full text IME, since the IME hint 51734e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // is still set to Persian, which needs advanced input. 51744e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int dateType = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE; 51754e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(dateType); 51764e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textType, textView.getInputType()); 51774e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51784e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Changing the input type to number password should keep the full text IME, since the IME 51794e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // hint is still set to Persian, which needs advanced input. But it also needs to set the 51804e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // text password flag. 51814e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int numberPasswordType = InputType.TYPE_CLASS_NUMBER 51824e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_NUMBER_VARIATION_PASSWORD; 51834e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int textPasswordType = InputType.TYPE_CLASS_TEXT 51844e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_PASSWORD; 51854e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(numberPasswordType); 51864e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(textPasswordType, textView.getInputType()); 51874e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51884e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // Setting the IME hint locales to null should reset the type to number password, since we 51894e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader // no longer need internationalized input. 51904e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(null); 51914e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(numberPasswordType, textView.getInputType()); 51924e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 51934e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 51944e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 51954e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 51964e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader public void testSetImeHintLocalesDoesntLoseInputType() { 51974e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final TextView textView = new TextView(mActivity); 51984e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setText("", BufferType.EDITABLE); 51994e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader final int inputType = InputType.TYPE_CLASS_TEXT 52004e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT 52014e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS 52024e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_MULTI_LINE 52034e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 52044e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setInputType(inputType); 52054e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader textView.setImeHintLocales(new LocaleList(Locale.US)); 52064e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader assertEquals(inputType, textView.getInputType()); 52074e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader } 52084e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader 52094e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @UiThreadTest 52104e7c9348dc19147dde716b43f92d1af41249af97Roozbeh Pournader @Test 521172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testSetExtractedText() { 521272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 521372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 521472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.getText().toString()); 521572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 521672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText et = new ExtractedText(); 5217ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5218ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text and selection. 521972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach et.text = "test"; 5220ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 0; 5221ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 2; 522272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 522372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setExtractedText(et); 522472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals("test", mTextView.getText().toString()); 5225ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(0, mTextView.getSelectionStart()); 5226ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionEnd()); 5227ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5228ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Use partialStartOffset and partialEndOffset 5229ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 2; 5230ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 5231ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = "x"; 5232ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionStart = 2; 5233ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.selectionEnd = 3; 5234ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5235ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 5236ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 5237ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, mTextView.getSelectionStart()); 5238ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, mTextView.getSelectionEnd()); 5239ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5240ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi // Update text with spans. 5241ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final SpannableString ss = new SpannableString("ex"); 5242ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new UnderlineSpan(), 0, 2, 0); 5243ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi ss.setSpan(new URLSpan("ctstest://TextView/test"), 1, 2, 0); 5244ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5245ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.text = ss; 5246ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialStartOffset = 1; 5247ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi et.partialEndOffset = 3; 5248ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi mTextView.setExtractedText(et); 5249ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5250ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("text", mTextView.getText().toString()); 5251ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final Editable editable = mTextView.getEditableText(); 5252ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final UnderlineSpan[] underlineSpans = mTextView.getEditableText().getSpans( 5253ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), UnderlineSpan.class); 5254ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, underlineSpans.length); 5255ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, editable.getSpanStart(underlineSpans[0])); 5256ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(underlineSpans[0])); 5257ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 5258ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi final URLSpan[] urlSpans = mTextView.getEditableText().getSpans( 5259ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi 0, editable.length(), URLSpan.class); 5260ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(1, urlSpans.length); 5261ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(2, editable.getSpanStart(urlSpans[0])); 5262ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals(3, editable.getSpanEnd(urlSpans[0])); 5263ba5ce949fafd36e5318108a261af06763651d6b7Keisuke Kuroyanagi assertEquals("ctstest://TextView/test", urlSpans[0].getURL()); 526472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 526572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5266a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 526772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testMoveCursorToVisibleOffset() throws Throwable { 526872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 526972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 527072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // not a spannable text 52714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 527272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 527372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 527472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a selection range 527572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach final String spannableText = "text"; 52766b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); 52779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 527872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 52794b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 5280a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov () -> mTextView.setText(spannableText, BufferType.SPANNABLE)); 528172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 528272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Selection.setSelection((Spannable) mTextView.getText(), 0, spannableText.length()); 528372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 528472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, mTextView.getSelectionStart()); 528572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(spannableText.length(), mTextView.getSelectionEnd()); 52864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertFalse(mTextView.moveCursorToVisibleOffset())); 528772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 528872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 528972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach // a spannable without range 52904b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 52916beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = findTextView(R.id.textview_text); 52926beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(spannableText, BufferType.SPANNABLE); 529372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach }); 529472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 529572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 52964b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> assertTrue(mTextView.moveCursorToVisibleOffset())); 529772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mInstrumentation.waitForIdleSync(); 529872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 529972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5300a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5301afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu public void testIsInputMethodTarget() throws Throwable { 530272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 530372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isInputMethodTarget()); 530472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 530572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.isFocused()); 53064b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> { 53076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 53086beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 53096beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu }); 5310afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu mInstrumentation.waitForIdleSync(); 5311afefb471cb741d3787da90aa03338f28c5cb6d87Brian Muramatsu assertTrue(mTextView.isFocused()); 531204d12809ae731ea2aea678707bcc606f05efb23aBrian Muramatsu 5313b7724cefaf6067b1f6b59d3abae73828b48945c3Kirill Grouchnikov PollingCheck.waitFor(mTextView::isInputMethodTarget); 531472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 531572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 53169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5317a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 53186a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir public void testBeginEndBatchEditAreNotCalledForNonEditableText() { 5319b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir final TextView mockTextView = spy(new TextView(mActivity)); 5320b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 5321b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // TextView should not call onBeginBatchEdit or onEndBatchEdit during initialization 5322b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5323b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 53246a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 532572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 53266a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.beginBatchEdit(); 5327b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5328b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5329b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 53306a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53316a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mockTextView.endBatchEdit(); 5332b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir // Since TextView doesn't support editing, the callbacks should not be called 5333b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onBeginBatchEdit(); 5334b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir verify(mockTextView, never()).onEndBatchEdit(); 53356a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 53366a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5337a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 53384b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testBeginEndBatchEditCallbacksAreCalledForEditableText() throws Throwable { 53399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView = spy(new TextView(mActivity))); 53409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 53416a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 5342a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final FrameLayout layout = new FrameLayout(mActivity); 53436a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( 53446a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT, 53456a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir ViewGroup.LayoutParams.MATCH_PARENT); 53469560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu layout.addView(mTextView, layoutParams); 53476a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir layout.setLayoutParams(layoutParams); 53486a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layout)); 53506a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 53516a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 53539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setKeyListener(QwertyKeyListener.getInstance(false, Capitalize.NONE)); 53549560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText("", BufferType.EDITABLE); 53559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.requestFocus(); 53566a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir }); 53576a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 53586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 53609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertTrue(mTextView.hasFocus()); 53619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 53629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 53636a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.beginBatchEdit(); 53656a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 53669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onBeginBatchEdit(); 53679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onEndBatchEdit(); 5368b0bae288153f4ac94e7b6fd83595acdedf1f1f6aSiyamed Sinir 53699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu reset(mTextView); 53709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.endBatchEdit(); 53719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, never()).onBeginBatchEdit(); 53729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(mTextView, times(1)).onEndBatchEdit(); 537372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 537472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 537572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5376a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 537772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testBringPointIntoView() throws Throwable { 537872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 537972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(1)); 538072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 538172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.layout(0, 0, 100, 100); 538272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.bringPointIntoView(2)); 538372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 538472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5385a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 538672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testCancelLongPress() { 538772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 53889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateLongPressOnViewCenter(mInstrumentation, mTextView); 538972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.cancelLongPress(); 539072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 539172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 539272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5393a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 539472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testClearComposingText() { 539572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 539672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setText("Hello world!", BufferType.SPANNABLE); 539772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach Spannable text = (Spannable) mTextView.getText(); 539872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 539972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 540072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 540172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 540272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach BaseInputConnection.setComposingSpans((Spannable) mTextView.getText()); 540372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 540472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(0, BaseInputConnection.getComposingSpanStart(text)); 540572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 540672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.clearComposingText(); 540772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 540872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(-1, BaseInputConnection.getComposingSpanStart(text)); 540972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 541072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 54119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5412a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 541372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testComputeVerticalScrollExtent() { 54149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new MockTextView(mActivity); 54159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 541672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5417a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov Drawable d = TestUtils.getDrawable(mActivity, R.drawable.pass); 54189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setCompoundDrawables(null, d, null, d); 541972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 54209560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu assertEquals(0, ((MockTextView) mTextView).computeVerticalScrollExtent()); 542172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 542272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 542372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach @UiThreadTest 5424a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 542572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testDidTouchFocusSelect() { 5426c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne mTextView = new EditText(mActivity); 542772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertFalse(mTextView.didTouchFocusSelect()); 542872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 542972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.setFocusable(true); 543072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView.requestFocus(); 543172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.didTouchFocusSelect()); 543272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 543372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 5434a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 54354b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSelectAllJustAfterTap() throws Throwable { 54360ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Prepare an EditText with focus. 54379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 54385799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky // Make a dummy focusable so that initial focus doesn't go to our test textview 54395799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky LinearLayout top = new LinearLayout(mActivity); 54405799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky TextView dummy = new TextView(mActivity); 54415799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky dummy.setFocusableInTouchMode(true); 54425799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 54436beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 54445799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(mTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 54455799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky mActivity.setContentView(top); 54460ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54476beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertFalse(mTextView.didTouchFocusSelect()); 54486beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setFocusable(true); 54496beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 54506beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu assertTrue(mTextView.didTouchFocusSelect()); 54510ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText("Hello, World.", BufferType.SPANNABLE); 54530ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka }); 54540ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 54550ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54560ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Tap the view to show InsertPointController. 54579404cdc3d439d5a2d1b805934c53a8ba6dc68fa8Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 545883a70cb57c839148a4feff786cdbb3803828d484Bobby Wang // bad workaround for waiting onStartInputView of LeanbackIme.apk done 545983a70cb57c839148a4feff786cdbb3803828d484Bobby Wang try { 546083a70cb57c839148a4feff786cdbb3803828d484Bobby Wang Thread.sleep(1000); 546183a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } catch (InterruptedException e) { 546283a70cb57c839148a4feff786cdbb3803828d484Bobby Wang e.printStackTrace(); 546383a70cb57c839148a4feff786cdbb3803828d484Bobby Wang } 54640ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54650ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // Execute SelectAll context menu. 54669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.onTextContextMenuItem(android.R.id.selectAll)); 54670ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka mInstrumentation.waitForIdleSync(); 54680ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54690ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka // The selection must be whole of the text contents. 54700ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(0, mTextView.getSelectionStart()); 547183a70cb57c839148a4feff786cdbb3803828d484Bobby Wang assertEquals("Hello, World.", mTextView.getText().toString()); 54720ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka assertEquals(mTextView.length(), mTextView.getSelectionEnd()); 54730ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka } 54740ddd054a4a00b9843563a38ab236fe3e47c99e9aSeigo Nonaka 54759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5476a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 547772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach public void testExtractText() { 547872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = new TextView(mActivity); 547972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 548072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedTextRequest request = new ExtractedTextRequest(); 548172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach ExtractedText outText = new ExtractedText(); 548272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 548372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.token = 0; 548472b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.flags = 10; 548572b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxLines = 2; 548672b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach request.hintMaxChars = 20; 548772b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 548872b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 548972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach mTextView = findTextView(R.id.textview_text); 549072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertTrue(mTextView.extractText(request, outText)); 549172b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 549272b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach assertEquals(mActivity.getResources().getString(R.string.text_view_hello), 549372b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach outText.text.toString()); 5494c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi 5495c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi // Tests for invalid arguments. 5496c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(request, null)); 5497c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, outText)); 5498c778c0d53d612a73b39cbf965f5068a3b0a10695Yoshiki Iguchi assertFalse(mTextView.extractText(null, null)); 549972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 550072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 550194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5502a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 550394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testTextDirectionDefault() { 5504c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 55052a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 550694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 550794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 550894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5509a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 551094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testSetGetTextDirection() { 5511c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 551294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 551394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 55142a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getRawTextDirection()); 551594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 551694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 55172a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getRawTextDirection()); 551894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 551994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 55202a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_INHERIT, tv.getRawTextDirection()); 552194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 552294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 55232a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getRawTextDirection()); 552494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 552594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 55262a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getRawTextDirection()); 552794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 552894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 55292a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getRawTextDirection()); 553002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 553102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 553202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getRawTextDirection()); 553302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 553402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 553502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getRawTextDirection()); 553694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 553794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 553894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5539a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 554094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtr() { 5541c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 554294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 554394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 55442a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 554594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 554694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 55472a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 554894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 554994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 55502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 555194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 555294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 55532a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 555494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 555594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 55562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 555794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 555894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 55592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 556094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 556194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 55622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 556302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 556402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 556502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 556602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 556702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 556802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 556994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 557094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 557194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5572a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 557394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionLtrWithInheritance() { 5574c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 557594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 557694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5577c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 557894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("this is a test"); 557994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 558094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 558194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 55822a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 558394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 558494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 55852a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 558694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 558794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 55882a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 558994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 559094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 55912a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 559294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 559394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 55942a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 559594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 559694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 55972a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 559802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 559902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 560002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 560102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 560202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 560302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 560494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 560594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 560694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5607a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 560894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtl() { 5609c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 561094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 561194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 56122a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 561394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 561494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 56152a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 561694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 561794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 56182a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 561994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 562094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 56212a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 562294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 562394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 56242a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 562594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 562694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 56272a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 562894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 562994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 56302a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 563102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 563202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 563302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 563402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 563502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 563602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 563794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 563894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 563994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5640a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 564194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testGetResolvedTextDirectionRtlWithInheritance() { 5642c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = new LinearLayout(mActivity); 564394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 564494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5645c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = new TextView(mActivity); 564694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setText("\u05DD\u05DE"); // hebrew 564794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.addView(tv); 564894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 564994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 56502a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 565194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 565294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 56532a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 565494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 565594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 56562a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 565794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 565894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 56592a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 566094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 566194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 56622a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 566394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 566494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 56652a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 566694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 566702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 566802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 566902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 567002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 567102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 567202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 567394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio // Force to RTL text direction on the layout 567494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 567594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 567694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG); 56772a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 567894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 567994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_ANY_RTL); 56802a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_ANY_RTL, tv.getTextDirection()); 568194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 568294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 56832a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 568494c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 568594c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LTR); 56862a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LTR, tv.getTextDirection()); 568794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 568894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_RTL); 56892a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 569094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 569194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_LOCALE); 56922a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_LOCALE, tv.getTextDirection()); 569302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 569402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 569502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 569602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 569702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 569802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 569994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 570094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 570194c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio @UiThreadTest 5702a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 570394c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio public void testResetTextDirection() { 5704c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 5705c2499432269114271f4b8ec17d07b469d2966fbeGilles Debunne TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 570694c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 570794c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.setTextDirection(View.TEXT_DIRECTION_RTL); 570894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio tv.setTextDirection(View.TEXT_DIRECTION_INHERIT); 57092a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 571094c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 5711f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // No reset when we remove the view 571294c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio ll.removeView(tv); 5713f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_RTL, tv.getTextDirection()); 5714f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio 5715f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio // Reset is done when we add the view 5716f0d2af33ae194bead489caef9b461f2bee6f45a6Fabrice Di Meglio ll.addView(tv); 57172a9c5b3b05fd5fae0fd01352283739c5f85ea8e0Fabrice Di Meglio assertEquals(View.TEXT_DIRECTION_FIRST_STRONG, tv.getTextDirection()); 571894c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio } 571994c94377f8f741065c7f15d52e4398699dae0844Fabrice Di Meglio 572002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5721a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 572202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongLtr() { 572302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 572402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 572502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 572602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 572702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 572802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 572902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 573002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 573102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 573202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 573302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 573402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 573502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 573602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 573702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 573802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 573902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 574002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 574102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 574202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 574302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 574402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 574502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 574602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 574702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 574802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 574902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 575002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 575102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 575202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 575302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 575402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 575502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is LTR. 575602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 575702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 575802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 575902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 576002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 576102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 576202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_LTR); 576302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_LTR, tv.getTextDirection()); 576402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 576502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 576602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 576702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 576802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 576902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 577002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 577102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka @UiThreadTest 5772a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 577302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka public void testTextDirectionFirstStrongRtl() { 577402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 577502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is LTR, the paragraph direction is LTR. 577602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 577702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 577802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 577902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("this is a test"); 578002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 578102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 578202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 578302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 578402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 578502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 578602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 578702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_LEFT_TO_RIGHT, layout.getParagraphDirection(0)); 578802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 578902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 579002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is RTL, the paragraph direction is RTL. 579102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 579202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 579302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 579402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\u05DD\u05DE"); // Hebrew 579502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 579602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 579702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 579802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 579902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 580002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 580102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 580202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 580302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 580402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka { 580502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // The first directional character is not a strong directional character, the paragraph 580602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka // direction is RTL. 580702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka LinearLayout ll = new LinearLayout(mActivity); 580802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 580902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka TextView tv = new TextView(mActivity); 581002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setText("\uFFFD"); // REPLACEMENT CHARACTER. Neutral direction. 581102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka ll.addView(tv); 581202c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 581302c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.setTextDirection(View.TEXT_DIRECTION_FIRST_STRONG_RTL); 581402c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(View.TEXT_DIRECTION_FIRST_STRONG_RTL, tv.getTextDirection()); 581502c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 581602c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka tv.onPreDraw(); // For freezing layout. 581702c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka Layout layout = tv.getLayout(); 581802c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka assertEquals(Layout.DIR_RIGHT_TO_LEFT, layout.getParagraphDirection(0)); 581902c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 582002c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka } 582102c09dc324e915d3786f0188704ad1753039bd40Seigo Nonaka 58229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5823a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5824c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader public void testTextLocales() { 5825c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader TextView tv = new TextView(mActivity); 5826c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.getDefault(), tv.getTextLocale()); 5827c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.getDefault(), tv.getTextLocales()); 5828c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5829c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(Locale.CHINESE); 5830c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.CHINESE, tv.getTextLocale()); 5831c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(new LocaleList(Locale.CHINESE), tv.getTextLocales()); 5832c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5833c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(LocaleList.forLanguageTags("en,ja")); 5834c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(Locale.forLanguageTag("en"), tv.getTextLocale()); 5835c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(LocaleList.forLanguageTags("en,ja"), tv.getTextLocales()); 5836c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5837c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5838c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocale(null); 5839c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to null should throw"); 5840c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5841c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5842c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5843c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5844c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5845c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(null); 5846c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locales to null should throw"); 5847c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5848c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5849c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5850c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 5851c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader try { 5852c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader tv.setTextLocales(new LocaleList()); 5853c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader fail("Setting the text locale to an empty list should throw"); 5854c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } catch (Throwable e) { 5855c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader assertEquals(IllegalArgumentException.class, e.getClass()); 5856c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5857c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader } 5858c2c082a53615033ece708f7e392474fef8ae2417Roozbeh Pournader 58599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 5860a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5861a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_Localization() { 5862a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String testString = "abcdefghijklmnopqrstuvwxyz i\u0307\u0301 άέήίΐόύΰώάυ ή"; 5863a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5864a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // Capital "i" in Turkish and Azerbaijani is different from English, Lithuanian has special 5865a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // rules for uppercasing dotted i with accents, and Greek has complex capitalization rules. 5866a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale[] testLocales = { 5867a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("az", "AZ"), // Azerbaijani 5868a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("tr", "TR"), // Turkish 5869a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("lt", "LT"), // Lithuanian 5870a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader new Locale("el", "GR"), // Greek 5871a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader Locale.US, 5872b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka }; 5873b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5874a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5875b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setAllCaps(true); 5876b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka for (Locale locale: testLocales) { 5877b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.setTextLocale(locale); 5878b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka assertEquals("Locale: " + locale.getDisplayName(), 5879a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader UCharacter.toUpperCase(locale, testString), 5880b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka tv.getTransformationMethod().getTransformation(testString, tv).toString()); 5881b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5882b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka } 5883b8eb7fd352a5fac5911460ebcedf53e6270c97dbSeigo Nonaka 5884dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5885a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5886a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader public void testAllCaps_SpansArePreserved() { 5887a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Locale greek = new Locale("el", "GR"); 5888a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String lowerString = "ι\u0301ριδα"; // ίριδα with first letter decomposed 5889a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final String upperString = "ΙΡΙΔΑ"; // uppercased 5890a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader // expected lowercase to uppercase index map 5891a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int[] indexMap = {0, 1, 1, 2, 3, 4, 5}; 5892a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final int flags = Spanned.SPAN_INCLUSIVE_INCLUSIVE; 5893a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5894a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final TextView tv = new TextView(mActivity); 5895a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setTextLocale(greek); 5896a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.setAllCaps(true); 5897a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5898a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spannable source = new SpannableString(lowerString); 5899a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 1, flags); 5900a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 2, flags); 5901a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 3, flags); 5902a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 3, 4, flags); 5903a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 4, 5, flags); 5904a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 5, 6, flags); 5905a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 2, flags); 5906a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 1, 3, flags); 5907a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 2, 4, flags); 5908a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader source.setSpan(new Object(), 0, 6, flags); 5909a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] sourceSpans = source.getSpans(0, source.length(), Object.class); 5910a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5911a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final CharSequence transformed = 5912a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader tv.getTransformationMethod().getTransformation(source, tv); 5913a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertTrue(transformed instanceof Spanned); 5914a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Spanned result = (Spanned) transformed; 5915a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5916a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(upperString, transformed.toString()); 5917a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object[] resultSpans = result.getSpans(0, result.length(), Object.class); 5918a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(sourceSpans.length, resultSpans.length); 5919a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader for (int i = 0; i < sourceSpans.length; i++) { 5920a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertSame(sourceSpans[i], resultSpans[i]); 5921a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader final Object span = sourceSpans[i]; 5922a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanStart(span)], result.getSpanStart(span)); 5923a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(indexMap[source.getSpanEnd(span)], result.getSpanEnd(span)); 5924a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader assertEquals(source.getSpanFlags(span), result.getSpanFlags(span)); 5925a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5926a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader } 5927a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader 5928a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @UiThreadTest 5929a179cec1b44f8d2cdb141bd040e9e333bb6b9610Roozbeh Pournader @Test 5930dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testTextAlignmentDefault() { 5931a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 59327fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5933dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // resolved default text alignment is GRAVITY 59347fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5935dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5936dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5937dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5938a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5939dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testSetGetTextAlignment() { 5940a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5941dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5942dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 59437fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 5944dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5945dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 59467fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getRawTextAlignment()); 5947dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5948dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 59497fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getRawTextAlignment()); 5950dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5951dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 59527fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getRawTextAlignment()); 5953dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5954dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 59557fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getRawTextAlignment()); 5956dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5957dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 59587fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getRawTextAlignment()); 5959dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5960dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5961dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5962a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5963dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignment() { 5964a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5965dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 59667fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5967dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5968757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test center alignment first so that we dont hit the default case 5969dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 59707fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 5971dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5972757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio // Test the default case too 5973757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5974757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 5975757ec4fdfd1798a8e28d050433c67e628a7f578dFabrice Di Meglio 5976dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 59777fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 5978dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5979dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 59807fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 5981dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5982dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 59837fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 5984dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5985dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 59867fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 5987dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 5988dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5989dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 5990a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 5991dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testGetResolvedTextAlignmentWithInheritance() { 5992a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = new LinearLayout(mActivity); 5993dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY); 5994dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5995a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = new TextView(mActivity); 5996dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.addView(tv); 5997dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 5998dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // check defaults 59997fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getRawTextAlignment()); 6000dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 6001dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6002dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // set inherit and check that child is following parent 6003dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 60047fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_INHERIT, tv.getRawTextAlignment()); 6005dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6006dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 60077fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6008dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6009dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 60107fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_START, tv.getTextAlignment()); 6011dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6012dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 60137fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_TEXT_END, tv.getTextAlignment()); 6014dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6015dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 60167fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_START, tv.getTextAlignment()); 6017dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6018dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 60197fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_VIEW_END, tv.getTextAlignment()); 6020dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6021dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio // now get rid of the inheritance but still change the parent 6022dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 6023dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6024dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 60257fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6026dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6027dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START); 60287fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6029dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6030dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_END); 60317fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6032dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6033dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 60347fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6035dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6036dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); 60377fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6038dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 6039dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6040dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio @UiThreadTest 6041a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6042dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio public void testResetTextAlignment() { 6043a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 6044a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_rtl); 6045dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6046dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 6047dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio tv.setTextAlignment(View.TEXT_ALIGNMENT_INHERIT); 60487fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 6049dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 60504f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // No reset when we remove the view 6051dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio ll.removeView(tv); 60524f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_CENTER, tv.getTextAlignment()); 60534f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio 60544f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Reset is done when we add the view 60554f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio // Default text alignment is GRAVITY 60564f6c5d77dfc74b490b8567d0b21adec0ccd72d22Fabrice Di Meglio ll.addView(tv); 60577fc94900b8661e27f89ae21523bd952127d510eaFabrice Di Meglio assertEquals(View.TEXT_ALIGNMENT_GRAVITY, tv.getTextAlignment()); 6058dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio } 6059dd7e30e4e18f67c4257379adecaa1df2bbe1992cFabrice Di Meglio 6060938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov @UiThreadTest 6061a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6062938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testDrawableResolution() { 6063b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 6064938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 6065a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6066938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6067a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 6068938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6069b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6070b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 1.2: left / right drawable defined in default RTL mode 6071938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 6072a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6073938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6074a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, -1, -1, 6075938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6076b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6077b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.1: start / end drawable defined in LTR mode 6078938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_1); 6079a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6080938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6081a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6082938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6083b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6084b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 2.2: start / end drawable defined in RTL mode 6085938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_2_2); 6086a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 6087938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6088a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6089938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6090b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6091b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.1: left / right / start / end drawable defined in LTR mode 6092938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_1); 6093a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6094938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6095a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6096938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6097b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6098b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 3.2: left / right / start / end drawable defined in RTL mode 6099938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_3_2); 6100a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 6101938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6102a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6103938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6104b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6105b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.1: start / end drawable defined in LTR mode inside a layout 6106b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 6107938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_1); 6108a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6109938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6110a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6111938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6112b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6113b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 4.2: start / end drawable defined in RTL mode inside a layout 6114b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 6115938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_4_2); 6116a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 6117938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6118a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6119938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6120b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6121b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.1: left / right / start / end drawable defined in LTR mode inside a layout 6122b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 6123938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_1); 6124a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6125938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6126a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6127938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6128b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 6129b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // Case 5.2: left / right / start / end drawable defined in RTL mode inside a layout 6130b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio // that defines the layout direction 6131938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_5_2); 6132a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_red, R.drawable.icon_blue, 6133938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6134a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawablesRelative(tv, R.drawable.icon_blue, R.drawable.icon_red, 6135938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 6136b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio } 6137b44fc868dc396032a3dae2ba8871168df95e620aFabrice Di Meglio 61389776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio @UiThreadTest 6139a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 61409776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio public void testDrawableResolution2() { 61419776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio // Case 1.1: left / right drawable defined in default LTR mode 6142938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov TextView tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_1); 6143a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6144938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 61459776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6146a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(null, null, 6147a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null); 6148a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, R.drawable.icon_yellow, -1, -1); 61499776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6150938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_drawable_1_2); 6151a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, 6152938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.drawable.icon_green, R.drawable.icon_yellow); 61539776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6154a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), null, 6155a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null); 6156a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 61579776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6158938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov tv = (TextView) mActivity.findViewById(R.id.textview_ltr); 6159a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, -1, -1, -1, -1); 61609776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6161a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawables(TestUtils.getDrawable(mActivity, R.drawable.icon_blue), null, 6162a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.getDrawable(mActivity, R.drawable.icon_red), null); 6163a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_blue, R.drawable.icon_red, -1, -1); 61649776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 6165a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov tv.setCompoundDrawablesRelative(TestUtils.getDrawable(mActivity, R.drawable.icon_yellow), 6166a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov null, null, null); 6167a82283fc3d03aadf14baa7e731bd43ab744e732aKirill Grouchnikov TestUtils.verifyCompoundDrawables(tv, R.drawable.icon_yellow, -1, -1, -1); 6168938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov } 6169938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 6170a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6171938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov public void testCompoundAndTotalPadding() { 6172938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final Resources res = mActivity.getResources(); 6173938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int drawablePadding = res.getDimensionPixelSize(R.dimen.textview_drawable_padding); 6174938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingLeft = res.getDimensionPixelSize(R.dimen.textview_padding_left); 6175938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingRight = res.getDimensionPixelSize(R.dimen.textview_padding_right); 6176938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingTop = res.getDimensionPixelSize(R.dimen.textview_padding_top); 6177938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int paddingBottom = res.getDimensionPixelSize(R.dimen.textview_padding_bottom); 6178938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int iconSize = TestUtils.dpToPx(mActivity, 32); 6179938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 6180938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewLtr = (TextView) mActivity.findViewById( 6181938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_ltr); 6182938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftLtr = paddingLeft + drawablePadding + iconSize; 6183938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightLtr = paddingRight + drawablePadding + iconSize; 6184938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingLeft()); 6185938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getCompoundPaddingStart()); 6186938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingLeft()); 6187938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftLtr, textViewLtr.getTotalPaddingStart()); 6188938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingRight()); 6189938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getCompoundPaddingEnd()); 6190938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingRight()); 6191938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightLtr, textViewLtr.getTotalPaddingEnd()); 6192938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 6193938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingTop()); 6194938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 6195938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewLtr.getCompoundPaddingBottom()); 6196938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov 6197938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final TextView textViewRtl = (TextView) mActivity.findViewById( 6198938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov R.id.textview_compound_drawable_rtl); 6199938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingLeftRtl = paddingLeft + drawablePadding + iconSize; 6200938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov final int combinedPaddingRightRtl = paddingRight + drawablePadding + iconSize; 6201938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingLeft()); 6202938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getCompoundPaddingEnd()); 6203938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingLeft()); 6204938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingLeftRtl, textViewRtl.getTotalPaddingEnd()); 6205938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingRight()); 6206938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getCompoundPaddingStart()); 6207938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingRight()); 6208938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(combinedPaddingRightRtl, textViewRtl.getTotalPaddingStart()); 6209938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingTop + drawablePadding + iconSize, 6210938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingTop()); 6211938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov assertEquals(paddingBottom + drawablePadding + iconSize, 6212938e01e2ecbc870a6de7296ea3cbb1550404439dKirill Grouchnikov textViewRtl.getCompoundPaddingBottom()); 62139776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio } 62149776f6746985a3740892cec4df71fbbc94bdaf84Fabrice Di Meglio 62159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 6216a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6217e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetBreakStrategy() { 6218e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 6219e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6220a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov final PackageManager pm = mInstrumentation.getTargetContext().getPackageManager(); 62212751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka 6222d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_HIGH_QUALITY for 62232751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // TextView except for Android Wear. The default value for Android Wear is 62242751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // BREAK_STRATEGY_BALANCED. 62252751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka if (pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) { 62262751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // Android Wear 62272751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 62282751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } else { 62292751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka // All other form factor. 62302751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 62312751d704e7028d7b7a3919318c0b7381be24197aSeigo Nonaka } 6232e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6233e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 6234e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_SIMPLE, tv.getBreakStrategy()); 6235e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6236e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 6237e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, tv.getBreakStrategy()); 6238e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6239e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 6240e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.BREAK_STRATEGY_BALANCED, tv.getBreakStrategy()); 6241d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6242d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi EditText et = new EditText(mActivity); 6243d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6244d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // The default value is from the theme, here the default is BREAK_STRATEGY_SIMPLE for 6245d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi // EditText. 6246d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 6247d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6248d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE); 6249d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_SIMPLE, et.getBreakStrategy()); 6250d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6251d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY); 6252d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_HIGH_QUALITY, et.getBreakStrategy()); 6253d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi 6254d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi et.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); 6255d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.BREAK_STRATEGY_BALANCED, et.getBreakStrategy()); 6256e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 6257e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 62589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @UiThreadTest 6259a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 6260e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka public void testSetGetHyphenationFrequency() { 6261e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka TextView tv = new TextView(mActivity); 6262e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6263d86c8a9d3dd63c69a09e5fa5c23b1ffc4d2fc2e2Keisuke Kuroyanagi assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 6264e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6265e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE); 6266e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NONE, tv.getHyphenationFrequency()); 6267e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6268e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); 6269e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_NORMAL, tv.getHyphenationFrequency()); 6270e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6271e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka tv.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); 6272e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka assertEquals(Layout.HYPHENATION_FREQUENCY_FULL, tv.getHyphenationFrequency()); 6273e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka } 6274e5862867943e7c107c70e825af58fffd30be7a9fSeigo Nonaka 6275a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @UiThreadTest 6276a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka @Test 6277a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka public void testSetGetJustify() { 6278a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka TextView tv = new TextView(mActivity); 6279a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 6280598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 6281598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_INTER_WORD); 6282598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, tv.getJustificationMode()); 6283598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka tv.setJustificationMode(Layout.JUSTIFICATION_MODE_NONE); 6284598f12bd40473f091c368fb5d483b3ca2acee604Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, tv.getJustificationMode()); 6285a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka } 6286a3cf2598fa76975e1051852c12fffe208cdfb52cSeigo Nonaka 6287a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 62884796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka public void testJustificationByStyle() { 62894796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView defaultTv = findTextView(R.id.textview_justification_default); 62904796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView noneTv = findTextView(R.id.textview_justification_none); 62914796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka TextView interWordTv = findTextView(R.id.textview_justification_inter_word); 62924796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 62934796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, defaultTv.getJustificationMode()); 62944796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_NONE, noneTv.getJustificationMode()); 62954796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka assertEquals(Layout.JUSTIFICATION_MODE_INTER_WORD, interWordTv.getJustificationMode()); 62964796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka } 62974796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka 62984796baa700b05b2a4df4866157960906ed4c9235Seigo Nonaka @Test 62994b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testSetAndGetCustomSelectionActionModeCallback() throws Throwable { 630032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi final String text = "abcde"; 63019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 63026beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView = new EditText(mActivity); 63036beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mActivity.setContentView(mTextView); 63046beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setText(text, BufferType.SPANNABLE); 63056beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setTextIsSelectable(true); 63066beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.requestFocus(); 63076beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.setSelected(true); 6308e1508b3cc13e50ae674eb4b9af6ee9f663e2b1e3Abodunrinwa Toki mTextView.setTextClassifier(TextClassifier.NO_OP); 630932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 631032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 631132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 631232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 631332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomSelectionActionModeCallback()); 631432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 631598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 631698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 631798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 631898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomSelectionActionModeCallback(mockActionModeCallback); 631998d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, 632032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mTextView.getCustomSelectionActionModeCallback()); 632132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 63229560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 63236beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 63246beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 63256beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 63266beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 63276beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 63286beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 632932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 633032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 633132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 633298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 633398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 633432944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 63359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 63366beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 63376beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 633832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 633932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 634032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 634132944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was blocked. 634298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, never()).onDestroyActionMode(any(ActionMode.class)); 634332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 634498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov // Reset and reconfigure callback. 634598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov reset(mockActionModeCallback); 634698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 634798d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.TRUE); 634898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomSelectionActionModeCallback()); 634932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 63509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 63516beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Set selection and try to start action mode. 63526beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu final Bundle args = new Bundle(); 63536beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 63546beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 63556beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.performAccessibilityAction( 63566beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 635732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 635832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 635932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 636032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 636198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onCreateActionMode( 636298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov any(ActionMode.class), any(Menu.class)); 636332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 63649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 63656beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu // Remove selection and stop action mode. 63666beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu mTextView.onTextContextMenuItem(android.R.id.copy); 636732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi }); 636832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi mInstrumentation.waitForIdleSync(); 636932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 637032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Action mode was started 637198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov verify(mockActionModeCallback, times(1)).onDestroyActionMode(any(ActionMode.class)); 637232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 637332944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 63746beed5d1888fd4878ad9bbcaa8a8a83a4e1ebfa9Andrei Stingaceanu @UiThreadTest 6375a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 637698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov public void testSetAndGetCustomInsertionActionMode() { 637732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi initTextViewForTyping(); 637832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // Check default value. 637932944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi assertNull(mTextView.getCustomInsertionActionModeCallback()); 638032944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 638198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final ActionMode.Callback mockActionModeCallback = mock(ActionMode.Callback.class); 638298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov when(mockActionModeCallback.onCreateActionMode(any(ActionMode.class), any(Menu.class))). 638398d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov thenReturn(Boolean.FALSE); 638498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mTextView.setCustomInsertionActionModeCallback(mockActionModeCallback); 638598d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(mockActionModeCallback, mTextView.getCustomInsertionActionModeCallback()); 638632944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi // TODO(Bug: 22033189): Tests the set callback is actually used. 638732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi } 638832944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 638989b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @UiThreadTest 639089b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky @Test 639189b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky public void testRespectsViewFocusability() { 639289b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky TextView v = (TextView) mActivity.findViewById(R.id.textview_singleLine); 639389b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertFalse(v.isFocusable()); 639489b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky // TextView used to set focusable to true or false verbatim which would break the following. 639589b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky v.setClickable(true); 639689b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky assertTrue(v.isFocusable()); 639789b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky } 639889b9540bbc634ab5acdf9083c694406dd4d1bb37Evan Rosky 6399a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 64009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu public void testTextShadows() throws Throwable { 640198d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textViewWithConfiguredShadow = 640298d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov (TextView) mActivity.findViewById(R.id.textview_with_shadow); 6403a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, textViewWithConfiguredShadow.getShadowDx(), 0.0f); 6404a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, textViewWithConfiguredShadow.getShadowDy(), 0.0f); 6405a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textViewWithConfiguredShadow.getShadowRadius(), 0.0f); 640698d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.GREEN, textViewWithConfiguredShadow.getShadowColor()); 640732944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 640898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6409a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDx(), 0.0f); 6410a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowDy(), 0.0f); 6411a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, textView.getShadowRadius(), 0.0f); 641232944498e0627347cbe7c275b6ff6f21b8c983faKeisuke Kuroyanagi 64139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setShadowLayer(5.0f, 3.0f, 4.0f, Color.RED)); 641498d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6415a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(3.0f, textView.getShadowDx(), 0.0f); 6416a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(4.0f, textView.getShadowDy(), 0.0f); 6417a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(5.0f, textView.getShadowRadius(), 0.0f); 641898d000ba45f2a9485e391b8a8abff1d891ea4dbbKirill Grouchnikov assertEquals(Color.RED, textView.getShadowColor()); 641972b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach } 642072b705b4df314c5cb81a9db2347fb6a6f9384b9aPhil Dubach 6421a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 64224b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testFontFeatureSettings() throws Throwable { 6423354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov final TextView textView = (TextView) mActivity.findViewById(R.id.textview_text); 6424354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertTrue(TextUtils.isEmpty(textView.getFontFeatureSettings())); 6425354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 64269560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("smcp")); 6427354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6428354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("smcp", textView.getFontFeatureSettings()); 6429354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 64309560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> textView.setFontFeatureSettings("frac")); 6431354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov mInstrumentation.waitForIdleSync(); 6432354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov assertEquals("frac", textView.getFontFeatureSettings()); 6433354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov } 6434354a3744faf4006b2d997ca71ffedef1da823c5eKirill Grouchnikov 6435a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 64364b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testIsSuggestionsEnabled() throws Throwable { 643741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 643841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 643941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything without InputType.TYPE_CLASS_TEXT doesn't have suggestions enabled 64404b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_DATETIME)); 644141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 644241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64434b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_PHONE)); 644441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 644541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64464b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread(() -> mTextView.setInputType(InputType.TYPE_CLASS_NUMBER)); 644741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 644841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 644941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // From this point our text view has InputType.TYPE_CLASS_TEXT 645041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 645141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Anything with InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS doesn't have suggestions enabled 64524b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 645341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 645441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 645541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 645641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64574b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 645841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 645941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL | 646041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 646141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 646241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64634b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 646441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 646541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | 646641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)); 646741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 646841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 646941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Otherwise suggestions are enabled for specific type variations enumerated in the 647041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // documentation of TextView.isSuggestionsEnabled 64714b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 647241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 647341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL)); 647441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 647541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64764b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 647741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 647841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT)); 647941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 648041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64814b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 648241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 648341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE)); 648441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 648541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64864b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 648741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 648841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE)); 648941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 649041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 64914b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 649241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 649341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT)); 649441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertTrue(mTextView.isSuggestionsEnabled()); 649541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 649641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // and not on any other type variation 64974b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 649841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 649941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)); 650041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 650141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65024b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 650341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 650441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER)); 650541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 650641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65074b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 650841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 650941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)); 651041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 651141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65124b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 651341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 651441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME)); 651541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 651641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65174b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 651841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 651941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC)); 652041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 652141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65224b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 652341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 652441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS)); 652541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 652641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65274b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 652841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 652941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI)); 653041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 653141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65324b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 653341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 653441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 653541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)); 653641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 653741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65384b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 653941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 654041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | 654141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS)); 654241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 654341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 65444b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov mActivityRule.runOnUiThread( 654541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setInputType( 654641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD)); 654741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertFalse(mTextView.isSuggestionsEnabled()); 654841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 654941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6550a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 65514b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testAccessLetterSpacing() throws Throwable { 655241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 6553a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(0.0f, mTextView.getLetterSpacing(), 0.0f); 655441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 655541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final CharSequence text = mTextView.getText(); 655641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int textLength = text.length(); 655741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 655841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at the default letter spacing 655941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] initialWidths = new float[textLength]; 656041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), initialWidths); 656141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 656241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 1.0f 65634b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 656441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(1.0f)); 6565a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(1.0f, mTextView.getLetterSpacing(), 0.0f); 656641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] singleWidths = new float[textLength]; 656741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), singleWidths); 656841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 656941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get advance widths of each character at letter spacing = 2.0f 65704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, 657141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov () -> mTextView.setLetterSpacing(2.0f)); 6572a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov assertEquals(2.0f, mTextView.getLetterSpacing(), 0.0f); 657341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final float[] doubleWidths = new float[textLength]; 657441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.getPaint().getTextWidths(text.toString(), doubleWidths); 657541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 657641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Since letter spacing setter treats the parameter as EM units, and we don't have 657741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // a way to convert EMs into pixels, go over the three arrays of advance widths and 657841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // test that the extra advance width at letter spacing 2.0f is double the extra 657941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // advance width at letter spacing 1.0f. 658041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov for (int i = 0; i < textLength; i++) { 658141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float singleWidthDelta = singleWidths[i] - initialWidths[i]; 658241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov float doubleWidthDelta = doubleWidths[i] - initialWidths[i]; 658341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("At index " + i + " initial is " + initialWidths[i] + 658441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov ", single is " + singleWidths[i] + " and double is " + doubleWidths[i], 658541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov singleWidthDelta * 2.0f, doubleWidthDelta, 0.05f); 658641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 658741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 658841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6589a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 65904b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testTextIsSelectableFocusAndOnClick() throws Throwable { 6591288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // Prepare a focusable TextView with an onClickListener attached. 6592288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu final View.OnClickListener mockOnClickListener = mock(View.OnClickListener.class); 6593d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu final int safeDoubleTapTimeout = ViewConfiguration.getDoubleTapTimeout() + 1; 65949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 65955799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky // set up a dummy focusable so that initial focus doesn't go to our test textview 65965799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky LinearLayout top = new LinearLayout(mActivity); 65975799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky TextView dummy = new TextView(mActivity); 65985799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky dummy.setFocusableInTouchMode(true); 65995799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(dummy, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 6600288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView = new TextView(mActivity); 660152e5d256861edd0ff4f58da581b8bbd9df1c1d99Siyamed Sinir mTextView.setText("...text 11:11. some more text is in here..."); 6602288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setFocusable(true); 6603288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mTextView.setOnClickListener(mockOnClickListener); 66045799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky top.addView(mTextView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 66055799e4361d40d9b8aa816ca7047ea97a3e71b6baEvan Rosky mActivity.setContentView(top); 6606288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu }); 6607288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6608288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6609288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isTextSelectable()); 6610288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocusableInTouchMode()); 6611288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6612288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isInTouchMode()); 6613288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6614288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view triggers onClick() but does not focus the TextView. 66158bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6616d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6617288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6618288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6619288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6620288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6621d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // So does the second tap. 66228bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6623d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6624288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6625288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6626288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6627288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 66289560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setTextIsSelectable(true)); 6629288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6630288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusable()); 6631288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isTextSelectable()); 6632288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocusableInTouchMode()); 6633288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertFalse(mTextView.isFocused()); 6634288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 6635288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu // First tap on the view focuses the TextView but does not trigger onClick(). 6636288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 66378bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6638d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6639288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6640288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6641288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, never()).onClick(mTextView); 6642288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu reset(mockOnClickListener); 6643d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu // The second tap triggers onClick() and keeps the focus. 66448bd3e888824438c3bc8ae24ca8842d9248b33924Andrei Stingaceanu CtsTouchUtils.emulateTapOnViewCenter(mInstrumentation, mTextView); 6645d25d1649c5d744044a0174a734e38ec22cdc7d25Andrei Stingaceanu SystemClock.sleep(safeDoubleTapTimeout); 6646288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isInTouchMode()); 6647288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu assertTrue(mTextView.isFocused()); 6648288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu verify(mockOnClickListener, times(1)).onClick(mTextView); 6649288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu } 6650288d156a90ddd9dd93c05e4892a73390e3778c00Andrei Stingaceanu 665141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov private void verifyGetOffsetForPosition(final int x, final int y) { 665241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int actual = mTextView.getOffsetForPosition(x, y); 665341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 665441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final Layout layout = mTextView.getLayout(); 665541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov if (layout == null) { 665641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", -1, actual); 665741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov return; 665841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 665941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 666041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the line which corresponds to the Y position 666141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int line = layout.getLineForVertical(y + mTextView.getScrollY()); 666241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov // Get the offset in that line that corresponds to the X position 666341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int expected = layout.getOffsetForHorizontal(line, x + mTextView.getScrollX()); 666441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertEquals("For [" + x + ", " + y + "]", expected, actual); 666541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 666641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 6667a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 66684b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov public void testGetOffsetForPosition() throws Throwable { 666941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView = findTextView(R.id.textview_text); 66704b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov WidgetTestUtils.runOnMainAndDrawSync(mActivityRule, mTextView, () -> { 667141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setText(LONG_TEXT); 667241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov mTextView.setPadding(0, 0, 0, 0); 667341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov }); 667441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 667541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov assertNotNull(mTextView.getLayout()); 667641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewWidth = mTextView.getWidth(); 667741b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int viewHeight = mTextView.getHeight(); 667841b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov final int lineHeight = mTextView.getLineHeight(); 667941b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 668041b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, 0); 668141b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(0, viewHeight / 2); 668241b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 3, lineHeight / 2); 668341b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth / 2, viewHeight / 2); 668441b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov verifyGetOffsetForPosition(viewWidth, viewHeight); 668541b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov } 668641b3e249a7d16d5b58a079f64ed9d769393391b6Kirill Grouchnikov 668757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @UiThreadTest 6688a75fb03266b58562af9ed30eff91f2a67d177adcKirill Grouchnikov @Test 668957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void testOnResolvePointerIcon() throws InterruptedException { 669057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView selectableTextView = findTextView(R.id.textview_pointer); 669157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final MotionEvent event = createMouseHoverEvent(selectableTextView); 669257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 669357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable view shows the I beam 669457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 669557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 669657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 669757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 669857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(false); 669957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 670057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A clickable view shows the hand 670157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setLinksClickable(true); 670257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri SpannableString builder = new SpannableString("hello world"); 670357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setText(builder, BufferType.SPANNABLE); 670457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri Spannable text = (Spannable) selectableTextView.getText(); 670557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri text.setSpan( 670657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri new ClickableSpan() { 670757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri @Override 670857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri public void onClick(View widget) { 670957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 671057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 671157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri }, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); 671257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 671357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 671457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 671557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 671657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // A selectable & clickable view shows hand 671757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.setTextIsSelectable(true); 671857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 671957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_HAND), 672057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri selectableTextView.onResolvePointerIcon(event, 0)); 672157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 672257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri // An editable view shows the I-beam 672357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final TextView editableTextView = new EditText(mActivity); 672457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 672557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri assertEquals(PointerIcon.getSystemIcon(mActivity, PointerIcon.TYPE_TEXT), 672657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri editableTextView.onResolvePointerIcon(event, 0)); 672757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 672857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 67299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 67306b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapInside() throws Throwable { 67319560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 67329560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 67339560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 67349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(1)).onClick(mTextView); 67359560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 67369560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 67379560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 67386b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDoubleTapInside() throws Throwable { 67399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 67409560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDoubleTapOnView(mInstrumentation, mTextView, spanDetails.mXPosInside, 67419560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosInside); 6742db34dc417570084e1598de3a6ebdacab4bbf1d66Andrei Stingaceanu verify(spanDetails.mClickableSpan, times(2)).onClick(mTextView); 67439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 67449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 67459560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 67466b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickSingleTapOutside() throws Throwable { 67479560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 67489560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateTapOnView(mInstrumentation, mTextView, spanDetails.mXPosOutside, 67499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spanDetails.mYPosOutside); 67509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 67519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 67529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 67539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu @Test 67546b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu public void testClickableSpanOnClickDragOutside() throws Throwable { 67559560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails spanDetails = prepareAndRetrieveClickableSpanDetails(); 67569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int[] viewOnScreenXY = new int[2]; 67579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.getLocationOnScreen(viewOnScreenXY); 67589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 67599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SparseArray<Point> swipeCoordinates = new SparseArray<>(); 67609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(0, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside, 67619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside)); 67629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu swipeCoordinates.put(1, new Point(viewOnScreenXY[0] + spanDetails.mXPosOutside + 50, 67639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu viewOnScreenXY[1] + spanDetails.mYPosOutside + 50)); 67649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu CtsTouchUtils.emulateDragGesture(mInstrumentation, swipeCoordinates); 67659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu verify(spanDetails.mClickableSpan, never()).onClick(mTextView); 67669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 67679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 6768771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @UiThreadTest 6769771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 6770771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu public void testOnInitializeA11yNodeInfo_populatesHintTextProperly() { 6771771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 6772771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText("", BufferType.EDITABLE); 6773771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String hintText = "Hint text"; 6774771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setHint(hintText); 6775771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); 6776771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6777771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6778771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not showing as accessibility text", 6779771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getText())); 6780771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6781771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6782771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 6783771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final String nonHintText = "Something else"; 6784771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.setText(nonHintText, BufferType.EDITABLE); 6785771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu textView.onInitializeAccessibilityNodeInfo(info); 6786771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertFalse("Hint text flag set incorrectly for accessibility", info.isShowingHintText()); 6787771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Text not provided to accessibility", 6788771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(nonHintText, info.getText())); 6789771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue("Hint text not provided to accessibility", 6790771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu TextUtils.equals(hintText, info.getHintText())); 6791771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 6792771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 67935b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu @Test 6794ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public void testAutosizeWithMaxLines_shouldNotThrowException() throws Throwable { 6795ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov // the layout contains an instance of CustomTextViewWithTransformationMethod 6796ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov final TextView textView = (TextView) mActivity.getLayoutInflater() 6797ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov .inflate(R.layout.textview_autosize_maxlines, null); 6798ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertTrue(textView instanceof CustomTextViewWithTransformationMethod); 6799ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertEquals(1, textView.getMaxLines()); 6800ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 6801ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov assertTrue(textView.getTransformationMethod() instanceof SingleLineTransformationMethod); 6802ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6803ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6804ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public static class CustomTextViewWithTransformationMethod extends TextView { 6805ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context) { 6806ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context); 6807ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6808ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6809ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6810ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6811ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs) { 6812ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs); 6813ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6814ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6815ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6816ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6817ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs, int defStyleAttr) { 6818ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs, defStyleAttr); 6819ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6820ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6821ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6822ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov public CustomTextViewWithTransformationMethod(Context context, 6823ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 6824ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov super(context, attrs, defStyleAttr, defStyleRes); 6825ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov init(); 6826ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6827ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6828ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov private void init() { 6829ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov setTransformationMethod(new SingleLineTransformationMethod()); 6830ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6831ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov } 6832ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov 6833ec13e43d14e684a1f0049b27e3fef92f3b7f21e2Anton Philippov @Test 683495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu public void testAutoSizeCallers_setText() throws Throwable { 683595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 683695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu R.id.textview_autosize_uniform, false); 683795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 683895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // Configure layout params and auto-size both in pixels to dodge flakiness on different 683995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // devices. 684095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 6841b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu 200, 200); 684295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 684395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setLayoutParams(layoutParams); 684495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setAutoSizeTextTypeUniformWithConfiguration( 684595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 1, 5000, 1, TypedValue.COMPLEX_UNIT_PX); 684695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu }); 684795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 684895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 684995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final String initialText = "13characters "; 6850b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu final StringBuilder textToSet = new StringBuilder().append(initialText); 6851b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu float initialSize = 0; 685295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 685395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // As we add characters the text size shrinks. 685495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu for (int i = 0; i < 10; i++) { 685595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 685695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 685795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 685895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu float expectedLargerSize = autoSizeTextView.getTextSize(); 6859b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu if (i == 0) { 6860b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu initialSize = expectedLargerSize; 6861b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu } 686295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 686395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu textToSet.append(initialText); 686495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 686595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 686695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 686795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 6868b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu assertTrue(expectedLargerSize >= autoSizeTextView.getTextSize()); 686995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 6870b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu assertTrue(initialSize > autoSizeTextView.getTextSize()); 687195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 6872508ace9be5df284fef1f90e49021719402f2c7f0Andrei Stingaceanu initialSize = Integer.MAX_VALUE; 687395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu // As we remove characters the text size expands. 687495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu for (int i = 9; i >= 0; i--) { 687595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 687695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 687795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 687895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu float expectedSmallerSize = autoSizeTextView.getTextSize(); 6879b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu if (i == 9) { 6880b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu initialSize = expectedSmallerSize; 6881b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu } 688295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 688395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu textToSet.replace((textToSet.length() - initialText.length()), textToSet.length(), ""); 688495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 688595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu autoSizeTextView.setText(textToSet.toString())); 688695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 688795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 6888b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() >= expectedSmallerSize); 688995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 6890b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialSize); 689195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu } 689295c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 689395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu @Test 689476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testAutoSize_setEllipsize() throws Throwable { 689576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById( 689676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 689776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeType = textView.getAutoSizeTextType(); 689876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMinTextSize = textView.getAutoSizeMinTextSize(); 689976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialMaxTextSize = textView.getAutoSizeMaxTextSize(); 690076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialAutoSizeGranularity = textView.getAutoSizeStepGranularity(); 690176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final int initialSizes = textView.getAutoSizeTextAvailableSizes().length; 690276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 690376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(null, textView.getEllipsize()); 690476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Verify styled attributes. 690576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, initialAutoSizeType); 690676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMinTextSize); 690776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, initialMaxTextSize); 690876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Because this TextView has been configured to use predefined sizes. 690976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, initialAutoSizeGranularity); 691076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, initialSizes); 691176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 691276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 691376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 691476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 691576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 691676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 691776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // Beside the ellipsis no auto-size attribute has changed. 691876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeType, textView.getAutoSizeTextType()); 691976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMinTextSize, textView.getAutoSizeMinTextSize()); 692076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialMaxTextSize, textView.getAutoSizeMaxTextSize()); 692176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialAutoSizeGranularity, textView.getAutoSizeStepGranularity()); 692276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(initialSizes, textView.getAutoSizeTextAvailableSizes().length); 692376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 692476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 692576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 692676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu public void testEllipsize_setAutoSize() throws Throwable { 692776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu TextView textView = findTextView(R.id.textview_text); 692876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu final TextUtils.TruncateAt newEllipsizeValue = TextUtils.TruncateAt.END; 692976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 693076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setEllipsize(newEllipsizeValue)); 693155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 693276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 693376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 693476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 693576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 693676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 693776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(0, textView.getAutoSizeTextAvailableSizes().length); 693876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 693976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 694076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 694155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 694276b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(newEllipsizeValue, textView.getEllipsize()); 694376b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 694476b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu // The auto-size defaults have been used. 694576b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMinTextSize()); 694676b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeMaxTextSize()); 694776b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(-1, textView.getAutoSizeStepGranularity()); 694876b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu assertNotEquals(0, textView.getAutoSizeTextAvailableSizes().length); 694976b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu } 695076b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu 695176b40dbf480769f42daf72ca54c1ab70f9975386Andrei Stingaceanu @Test 695208aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu public void testAutoSizeCallers_setTransformationMethod() throws Throwable { 695308aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 695408aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu R.id.textview_autosize_uniform, false); 695508aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu // Mock transformation method to return the duplicated input text in order to measure 695608aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu // auto-sizing. 695708aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu TransformationMethod duplicateTextTransformationMethod = mock(TransformationMethod.class); 695808aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu when(duplicateTextTransformationMethod 695908aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu .getTransformation(any(CharSequence.class), any(View.class))) 696008aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu .thenAnswer(invocation -> { 696108aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu CharSequence source = (CharSequence) invocation.getArguments()[0]; 696208aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu return new StringBuilder().append(source).append(source).toString(); 696308aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu }); 696408aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu 696508aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 696608aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu autoSizeTextView.setTransformationMethod(null)); 696708aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 696808aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 696908aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 697008aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu autoSizeTextView.setTransformationMethod(duplicateTextTransformationMethod)); 697108aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 697208aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu 697308aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 697408aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu } 697508aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu 697608aa7fd130c01bdc3cfc3fd91370ef4e4c908155Andrei Stingaceanu @Test 6977cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawables() throws Throwable { 6978069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69799000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6980069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6981cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6982c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6983cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 6984cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setCompoundDrawables(drawable, drawable, drawable, drawable)); 6985cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 6986069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 6987069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 6988cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 6989cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 6990cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 6991cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablesRelative() throws Throwable { 6992069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 69939000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 6994069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 6995cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 6996c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3); 6997cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablesRelative( 6998cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 6999cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7000069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7001069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7002cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7003cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7004cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7005cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setCompoundDrawablePadding() throws Throwable { 7006069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70079000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7008cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // Prepare a larger layout in order not to hit the min value easily. 7009cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7010cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setWidth(autoSizeTextView.getWidth() * 2); 7011cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.setHeight(autoSizeTextView.getHeight() * 2); 7012cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu }); 7013cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7014cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Setup the drawables before setting their padding in order to modify the available 7015cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // space and trigger a resize. 7016cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu Drawable drawable = TestUtils.getDrawable(mActivity, R.drawable.red); 7017cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu drawable.setBounds(0, 0, autoSizeTextView.getWidth() / 4, autoSizeTextView.getHeight() / 4); 7018cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawables( 7019cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu drawable, drawable, drawable, drawable)); 7020cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7021069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7022cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setCompoundDrawablePadding( 7023cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextView.getCompoundDrawablePadding() + 10)); 7024cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7025069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7026069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7027cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7028cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7029cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7030cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPadding() throws Throwable { 7031069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70329000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7033069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7034c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPadding( 7035c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 7036c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 7037cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7038069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7039069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7040cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7041cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7042cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7043cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setPaddingRelative() throws Throwable { 7044069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70459000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7046069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7047cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7048c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setPaddingRelative( 7049c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3, 7050c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 3, autoSizeTextView.getHeight() / 3)); 7051cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7052069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7053069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7054cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7055cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7056cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7057cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTextScaleX() throws Throwable { 7058069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7060069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7061cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7062cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7063069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX() * 4.5f)); 7064cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7065069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 7066069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7067069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 7068069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7069cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7070cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTextScaleX(autoSizeTextView.getTextScaleX())); 7071cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7072069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7073069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 7074cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7075cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7076cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7077cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setTypeface() throws Throwable { 7078069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 70799000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7080069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7081069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setText("The typeface change needs a bit more text then " 7082069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the default used for this batch of tests in order to get to resize text." 7083069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + " The resize function is always called but even with different typefaces " 7084069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "there may not be a need to resize text because it just fits. The longer " 7085069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "the text, the higher the chance for a resize. And here is yet another " 7086069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu + "sentence to make sure this test is not flaky. Not flaky at all.")); 7087069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7088069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7089cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7090c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 7091c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu Typeface differentTypeface = Typeface.MONOSPACE; 7092c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu if (autoSizeTextView.getTypeface() == Typeface.MONOSPACE) { 7093c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu differentTypeface = Typeface.SANS_SERIF; 7094c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu } 7095c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setTypeface(differentTypeface); 7096c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu }); 7097cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7098069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 7099069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7100069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Don't really know if it is larger or smaller (depends on the typeface chosen above), 7101069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // but it should definitely have changed. 7102069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertNotEquals(initialTextSize, changedTextSize, 0f); 7103069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7104cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7105cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.setTypeface(autoSizeTextView.getTypeface())); 7106cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7107069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7108069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 7109cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7110cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7111cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7112cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLetterSpacing() throws Throwable { 7113069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 71149000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7115069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7116cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7117cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7118c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // getLetterSpacing() could return 0, make sure there is enough of a difference to 7119c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu // trigger auto-size. 7120c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.setLetterSpacing( 7121069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLetterSpacing() * 1.5f + 4.5f)); 7122cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7123069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 7124cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7125069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 7126c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 7127cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> 7128069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.setLetterSpacing(autoSizeTextView.getLetterSpacing())); 7129cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7130069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7131069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 7132cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7133cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7134cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7135cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHorizontallyScrolling() throws Throwable { 7136069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 71379000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7138697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu // Verify that we do not have horizontal scrolling turned on. 7139697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(!autoSizeTextView.getHorizontallyScrolling()); 7140697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu 7141069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7142697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(true)); 7143cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7144697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 7145069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7146697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHorizontallyScrolling(false)); 7147cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7148697ced0718c9e459b2df1b1f27933ec1914dea9fAndrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 7149cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7150cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7151cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7152cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxLines() throws Throwable { 7153069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 71549000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 71558f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu // Configure layout params and auto-size both in pixels to dodge flakiness on different 71568f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu // devices. 71578f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 71588f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 200, 200); 71598f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu final String text = "one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten"; 71608f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 71618f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu autoSizeTextView.setLayoutParams(layoutParams); 71628f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu autoSizeTextView.setAutoSizeTextTypeUniformWithConfiguration( 71638f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 1 /* autoSizeMinTextSize */, 71648f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 5000 /* autoSizeMaxTextSize */, 71658f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 1 /* autoSizeStepGranularity */, 71668f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 71678f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu autoSizeTextView.setText(text); 71688f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu }); 7169cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7170069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 71718f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu float initialSize = 0; 71728f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu for (int i = 1; i < 10; i++) { 71738f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu final int maxLines = i; 71748f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(maxLines)); 71758f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 71768f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu float expectedSmallerSize = autoSizeTextView.getTextSize(); 71778f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu if (i == 1) { 71788f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu initialSize = expectedSmallerSize; 71798f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu } 71808f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 71818f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(maxLines + 1)); 71828f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 71838f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu assertTrue(expectedSmallerSize <= autoSizeTextView.getTextSize()); 71848f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu } 71858f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu assertTrue(initialSize < autoSizeTextView.getTextSize()); 71868f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 71878f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu initialSize = Integer.MAX_VALUE; 71888f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu for (int i = 10; i > 1; i--) { 71898f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu final int maxLines = i; 71908f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(maxLines)); 71918f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 71928f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu float expectedLargerSize = autoSizeTextView.getTextSize(); 71938f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu if (i == 10) { 71948f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu initialSize = expectedLargerSize; 71958f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu } 71968f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu 71978f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxLines(maxLines - 1)); 71988f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 71998f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu assertTrue(expectedLargerSize >= autoSizeTextView.getTextSize()); 72008f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu } 72018f7fc92529e98d1933a28058960617826da77ba0Andrei Stingaceanu assertTrue(initialSize > autoSizeTextView.getTextSize()); 7202cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7203cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7204cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7205cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxHeight() throws Throwable { 7206069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72079000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7208069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 7209069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7210069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 7211069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 7212069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7213069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7214069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7215c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxHeight( 7216069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getHeight() / 4)); 7217cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7218069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7219069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7220cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7221cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7222cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7223cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setHeight() throws Throwable { 7224069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72259000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7226069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact height only. 7227069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7228069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200, 7229069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 7230069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7231069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7232069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7233c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 7234c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getHeight() / 4)); 7235cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7236069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7237069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7238cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7239cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7240cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7241cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLines() throws Throwable { 7242069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72439000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7244069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7245069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLines(1)); 7246cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7247069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7248069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() < initialTextSize); 7249cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7250cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7251cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7252cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setMaxWidth() throws Throwable { 7253069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72549000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7255cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width only. 7256cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7257cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7258069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 7259cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7260cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7261069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7262c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setMaxWidth( 7263c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 7264cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7265069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7266069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 7267cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7268cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7269cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7270cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setWidth() throws Throwable { 7271069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72729000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, true); 7273069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu // Do not force exact width only. 7274069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7275069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 7276069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 200); 7277069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLayoutParams(layoutParams)); 7278069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7279cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7280069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7281c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setWidth( 7282c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu autoSizeTextView.getWidth() / 4)); 7283cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7284069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7285069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() != initialTextSize); 7286cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7287cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7288cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 7289cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu public void testAutoSizeCallers_setLineSpacing() throws Throwable { 7290069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 72919000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7292069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7293c0e543b38bdb38c13644ae3f74242afdbf064e9fAndrei Stingaceanu 7294cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 7295069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra() * 4, 7296069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier() * 4)); 7297cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7298069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float changedTextSize = autoSizeTextView.getTextSize(); 7299069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7300069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertTrue(changedTextSize < initialTextSize); 7301069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7302cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setLineSpacing( 7303cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingExtra(), 7304cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu autoSizeTextView.getLineSpacingMultiplier())); 7305cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7306069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7307069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(changedTextSize, autoSizeTextView.getTextSize(), 0f); 7308069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu } 7309069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7310069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu @Test 7311069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu public void testAutoSizeCallers_setTextSizeIsNoOp() throws Throwable { 7312069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView autoSizeTextView = prepareAndRetrieveAutoSizeTestData( 73139000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform, false); 7314069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 7315069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7316069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setTextSize( 7317069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu initialTextSize + 123f)); 7318069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 7319069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu 7320069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu assertEquals(initialTextSize, autoSizeTextView.getTextSize(), 0f); 7321cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 7322cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 7323cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu @Test 732455eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu public void testAutoSizeCallers_setHeightForOneLineText() throws Throwable { 732555eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final TextView autoSizeTextView = (TextView) mActivity.findViewById( 732655eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu R.id.textview_autosize_basic); 732755eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, autoSizeTextView.getAutoSizeTextType()); 732855eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu final float initialTextSize = autoSizeTextView.getTextSize(); 732955eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextView.setHeight( 733055eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu autoSizeTextView.getHeight() * 3)); 733155eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 733255eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 733355eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu assertTrue(autoSizeTextView.getTextSize() > initialTextSize); 733455eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu } 733555eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu 733655eade2b5ede2df089f03018e8e142b3a179385bAndrei Stingaceanu @Test 73379000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributes() { 73385b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics(); 73399000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 73409000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 73415b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 73429000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // The size has been set to 50dp in the layout but this being an AUTO_SIZE_TEXT_TYPE_UNIFORM 7343771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // TextView, the size is considered max size thus the value returned by getSize() in this 7344771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // case should be lower than the one set (given that there is not much available space and 7345771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // the font size is very high). In theory the values could be equal for a different TextView 73465b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu // configuration. 73475b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu final float sizeSetInPixels = TypedValue.applyDimension( 73485b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu TypedValue.COMPLEX_UNIT_DIP, 50f, metrics); 73499000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertTrue(autoSizeTextViewUniform.getTextSize() < sizeSetInPixels); 73505b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu } 73515b44d230a4e966f12488126d75b1c0ea57072748Andrei Stingaceanu 73524f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver @Test 73539000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesUsingPredefinedSizes() { 7354cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu DisplayMetrics m = mActivity.getResources().getDisplayMetrics(); 73559000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 73569000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes); 735755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 735855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 10px, 10dp, 10sp, 10pt, 10in and 10mm. 7359cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // TypedValue can not use the math library and instead naively ceils the value by adding 7360cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu // 0.5f when obtaining styled attributes. Check TypedValue#complexToDimensionPixelSize(...) 7361cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu int[] expectedSizesInPx = new int[] { 7362cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 10f, m)), 7363cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, m)), 7364cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10f, m)), 7365cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PT, 10f, m)), 7366cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_IN, 10f, m)), 7367cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu (int) (0.5f + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10f, m))}; 736855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 736955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu boolean containsValueFromExpectedSizes = false; 73709000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu int textSize = (int) autoSizeTextViewUniform.getTextSize(); 7371cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu for (int i = 0; i < expectedSizesInPx.length; i++) { 7372cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu if (expectedSizesInPx[i] == textSize) { 737355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu containsValueFromExpectedSizes = true; 737455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu break; 737555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 737655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 737755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(containsValueFromExpectedSizes); 737855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 737955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 738055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 73819000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_obtainStyledAttributesPredefinedSizesFiltering() { 73829000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 73839000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform_predef_sizes_redundant_values); 738455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 738555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // In arrays.xml predefined the step sizes as: 40px, 10px, 10px, 10px, 0dp. 738655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] expectedSizes = new int[] {10, 40}; 73879000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(expectedSizes, autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 738855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 738955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 739055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 73919000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesFilteringAndSorting() throws Throwable { 739255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 739355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 739455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 739555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[] {400, 0, 10, 40, 10, 10, 0, 0}; 7396cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7397cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 739855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 73999000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertArrayEquals(new int[] {10, 40, 400}, mTextView.getAutoSizeTextAvailableSizes()); 740055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 740155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 740255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test(expected = NullPointerException.class) 74039000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesNullArray() throws Throwable { 740455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 740555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 740655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 740755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = null; 7408cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7409cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 741055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 741155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 741255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 741355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 74149000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_predefinedSizesEmptyArray() throws Throwable { 741555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 741655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 741755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 741855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7419cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 742055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 742155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 74229000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] defaultSizes = mTextView.getAutoSizeTextAvailableSizes(); 742355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 742455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(defaultSizes.length > 0); 742555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 742655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu final int[] predefinedSizes = new int[0]; 7427cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setAutoSizeTextTypeUniformWithPresetSizes( 7428cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu predefinedSizes, TypedValue.COMPLEX_UNIT_PX)); 742955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 743055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 74319000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu final int[] newSizes = mTextView.getAutoSizeTextAvailableSizes(); 743255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotNull(defaultSizes); 743355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals(defaultSizes, newSizes); 743455b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 743555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 743655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 74379000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_buildsSizes() throws Throwable { 74389000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu TextView autoSizeTextViewUniform = (TextView) mActivity.findViewById( 74399000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu R.id.textview_autosize_uniform); 744055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 744155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu // Verify that the interval limits are both included. 7442cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7443cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration(10, 20, 2, 7444cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 744555b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 744655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 744755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 74489000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 744955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7450cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7451cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7452cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7453cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 19, 7454cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7455cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 745655b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 745755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 745855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18}, 74599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 746055b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 7461cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> autoSizeTextViewUniform 7462cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu .setAutoSizeTextTypeUniformWithConfiguration( 7463cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeMinTextSize(), 7464cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 21, 7465cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeStepGranularity(), 7466cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX)); 746755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 746855b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertArrayEquals( 746955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu new int[] {10, 12, 14, 16, 18, 20}, 74709000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu autoSizeTextViewUniform.getAutoSizeTextAvailableSizes()); 747155b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu } 747255b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu 747355b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu @Test 74749000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeTextDefaults() { 74754f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver final TextView textView = new TextView(mActivity); 7476771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7477771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max/Granularity values for auto-sizing are 0 because they are not used. 7478cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7479cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7480cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7481771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7482cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 74839000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7484771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max default values for auto-sizing XY have been loaded. 7485771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7486771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 748755b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertTrue(0 < minSize); 7488771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue(minSize < maxSize); 748955b2bd01a56bc397b4ef51af69706dd811c3036cAndrei Stingaceanu assertNotEquals(0, textView.getAutoSizeStepGranularity()); 7490771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7491cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_NONE); 7492771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7493771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min/Max values for auto-sizing XY have been cleared. 7494cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMinTextSize()); 7495cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeMaxTextSize()); 7496cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu assertEquals(-1, textView.getAutoSizeStepGranularity()); 7497771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7498771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7499771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 75009000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeStepGranularity() { 7501771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7502771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, textView.getAutoSizeTextType()); 7503cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final int initialValue = -1; 7504771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(initialValue, textView.getAutoSizeStepGranularity()); 75054f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7506cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 75079000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7508771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int defaultValue = 1; // 1px. 75099000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // If the auto-size type is AUTO_SIZE_TEXT_TYPE_UNIFORM then it means textView went through 75109000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu // the auto-size setup and given that 0 is an invalid value it changed it to the default. 7511771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(defaultValue, textView.getAutoSizeStepGranularity()); 7512771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7513771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newValue = 33; 7514cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7515cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7516cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7517cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newValue, 7518cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7519771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newValue, textView.getAutoSizeStepGranularity()); 7520771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7521771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7522771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 75239000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMinTextSize() { 7524771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7525cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 75269000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7527771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7528771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7529771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7530771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7531771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7532771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // This is just a test check to verify the next assertions. If this fails it is a problem 7533771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // of this test setup (we need at least 2 units). 7534771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertTrue((maxSize - minSize) > 1); 7535771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMinSize = maxSize - 1; 7536cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7537cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7538cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMaxTextSize(), 7539cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7540cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7541cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7542771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMinSize, textView.getAutoSizeMinTextSize()); 7543771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Max size has not changed. 7544771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(maxSize, textView.getAutoSizeMaxTextSize()); 7545771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7546cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7547cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize, 7548cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMinSize + 10, 7549cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7550cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7551cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7552771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the min size, the getter always 7553771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 755495c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMinSize, 755595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu mActivity.getResources().getDisplayMetrics())), textView.getAutoSizeMinTextSize()); 7556771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7557771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7558cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 75599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_throwsException_whenMaxLessThanMin() { 7560771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7561cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7562cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7563cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7564cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7565cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7566cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_minLessThanZero() { 7567cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7568cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7569cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu -1, 9, 1, TypedValue.COMPLEX_UNIT_SP); 7570cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7571cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7572cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7573cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_maxLessThanZero() { 7574cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7575cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7576cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, -1, 1, TypedValue.COMPLEX_UNIT_SP); 7577cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu } 7578cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7579cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu @Test(expected = IllegalArgumentException.class) 7580cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu public void testAutoSizeUniform_throwsException_granularityLessThanZero() { 7581cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7582cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7583cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 10, 20, -1, TypedValue.COMPLEX_UNIT_SP); 7584771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 7585771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7586771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 75870716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu public void testAutoSizeUniform_equivalentConfigurations() throws Throwable { 75880716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final DisplayMetrics dm = mActivity.getResources().getDisplayMetrics(); 75890716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int minTextSize = 10; 75900716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int maxTextSize = 20; 75910716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int granularity = 2; 75920716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int unit = TypedValue.COMPLEX_UNIT_SP; 75930716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 75940716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final TextView granularityTextView = new TextView(mActivity); 75950716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.setAutoSizeTextTypeUniformWithConfiguration( 75960716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu minTextSize, maxTextSize, granularity, unit); 75970716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 75980716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final TextView presetTextView = new TextView(mActivity); 75990716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.setAutoSizeTextTypeUniformWithPresetSizes( 76000716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu new int[] {minTextSize, 12, 14, 16, 18, maxTextSize}, unit); 76010716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76020716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // The TextViews have been configured differently but the end result should be nearly 76030716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // identical. 76040716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedAutoSizeType = TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM; 76050716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedAutoSizeType, granularityTextView.getAutoSizeTextType()); 76060716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedAutoSizeType, presetTextView.getAutoSizeTextType()); 76070716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76080716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedMinTextSizeInPx = Math.round( 76090716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu TypedValue.applyDimension(unit, minTextSize, dm)); 76100716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMinTextSizeInPx, granularityTextView.getAutoSizeMinTextSize()); 76110716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMinTextSizeInPx, presetTextView.getAutoSizeMinTextSize()); 76120716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76130716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final int expectedMaxTextSizeInPx = Math.round( 76140716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu TypedValue.applyDimension(unit, maxTextSize, dm)); 76150716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMaxTextSizeInPx, granularityTextView.getAutoSizeMaxTextSize()); 76160716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(expectedMaxTextSizeInPx, presetTextView.getAutoSizeMaxTextSize()); 76170716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76180716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configured with granularity. 76190716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(unit, granularity, dm)), 76200716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.getAutoSizeStepGranularity()); 76210716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configured with preset values, there is no granularity. 76220716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(-1, presetTextView.getAutoSizeStepGranularity()); 76230716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76240716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Both TextViews generate exactly the same sizes in pixels to choose from when auto-sizing. 762595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu assertArrayEquals("Expected the granularity and preset configured auto-sized " 762695c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "TextViews to have identical available sizes for auto-sizing." 762795c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "\ngranularity sizes: " 762895c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + Arrays.toString(granularityTextView.getAutoSizeTextAvailableSizes()) 762995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + "\npreset sizes: " 763095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu + Arrays.toString(presetTextView.getAutoSizeTextAvailableSizes()), 76310716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.getAutoSizeTextAvailableSizes(), 76320716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.getAutoSizeTextAvailableSizes()); 76330716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76340716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu final String someText = "This is a string"; 763595c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 7636b17f1627e674f015e22dc57dbfa58200c9d59d85Andrei Stingaceanu 200, 200); 76370716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu // Configure identically and attach to layout. 76380716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 763995c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu granularityTextView.setLayoutParams(layoutParams); 764095c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu presetTextView.setLayoutParams(layoutParams); 764195c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu 76420716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu LinearLayout ll = mActivity.findViewById(R.id.layout_textviewtest); 764395c9bc438b5008465f5fb7cb8875781ec41c58fbAndrei Stingaceanu ll.removeAllViews(); 76440716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu ll.addView(granularityTextView); 76450716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu ll.addView(presetTextView); 76460716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76470716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu granularityTextView.setText(someText); 76480716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu presetTextView.setText(someText); 76490716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu }); 76500716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 76510716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76520716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(granularityTextView.getTextSize(), presetTextView.getTextSize(), 0f); 76530716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu } 76540716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu 76550716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu @Test 76569000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_getSetAutoSizeMaxTextSize() { 7657771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final TextView textView = new TextView(mActivity); 7658cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM); 76599000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM, textView.getAutoSizeTextType()); 7660771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int minSize = textView.getAutoSizeMinTextSize(); 7661771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, minSize); 7662771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int maxSize = textView.getAutoSizeMaxTextSize(); 7663771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(0, maxSize); 7664771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu 7665771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int newMaxSize = maxSize + 11; 7666cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7667cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7668cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7669cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7670cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_PX); 7671cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu 7672771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(newMaxSize, textView.getAutoSizeMaxTextSize()); 7673771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Min size has not changed. 7674771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(minSize, textView.getAutoSizeMinTextSize()); 7675cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.setAutoSizeTextTypeUniformWithConfiguration( 7676cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeMinTextSize(), 7677cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu newMaxSize, 7678cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu textView.getAutoSizeStepGranularity(), 7679cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu TypedValue.COMPLEX_UNIT_SP); 7680771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // It does not matter which unit has been used to set the max size, the getter always 7681771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // returns it in pixels. 76820716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu assertEquals(Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, newMaxSize, 76830716712857a64ae98c443721a1d8560eb0c1abfeAndrei Stingaceanu mActivity.getResources().getDisplayMetrics())), textView.getAutoSizeMaxTextSize()); 76844f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver } 76854f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7686771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu @Test 76879000bece309586531c4f6ec36030c3f9894ce17bAndrei Stingaceanu public void testAutoSizeUniform_autoSizeCalledWhenTypeChanged() throws Throwable { 7688771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView = findTextView(R.id.textview_text); 7689771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Make sure we pick an already inflated non auto-sized text view. 7690771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(TextView.AUTO_SIZE_TEXT_TYPE_NONE, mTextView.getAutoSizeTextType()); 7691771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // Set the text size to a very low value in order to prepare for auto-size. 7692771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu final int customTextSize = 3; 7693771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7694771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, customTextSize)); 7695771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7696771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertEquals(customTextSize, mTextView.getTextSize(), 0f); 7697771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mActivityRule.runOnUiThread(() -> 7698cf3c111bc64d031247af31581ecda38d507274bdAndrei Stingaceanu mTextView.setAutoSizeTextTypeWithDefaults(TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM)); 7699771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu mInstrumentation.waitForIdleSync(); 7700771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu // The size of the text should have changed. 7701771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu assertNotEquals(customTextSize, mTextView.getTextSize(), 0f); 7702771078e382470352e547c3ac6a3dd93883d504fdAndrei Stingaceanu } 77034f0c51ceb2e72548d9028e3797c4a86752d2b14fPhil Weaver 7704ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki @Test 7705ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki public void testSmartSelection() throws Throwable { 7706ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki mTextView = findTextView(R.id.textview_text); 7707ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 7708ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int startIndex = text.indexOf("president"); 7709ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int endIndex = startIndex + "president".length(); 771009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 7711ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 771209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 7713ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 771409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 771509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 771609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 7717ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki // TODO: Test the floating toolbar content. 7718ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 771909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 77204d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov private boolean isWatch() { 77214d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov return (mActivity.getResources().getConfiguration().uiMode 772272cb042dc6e6549a0b0b00bf94f0a0d427c9520cMark Urbanus & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_WATCH; 77234d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov } 77244d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov 772509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 772609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_dragSelection() throws Throwable { 77274d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov if (isWatch()) { 77284d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov return; 77294d8a2ce3fd2219dbab66941733e476bb1498adecKirill Grouchnikov } 773009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 773109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 773209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("is coming to town"); 773309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "is coming to town".length(); 773409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 773509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 773609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point start = getCenterPositionOfTextAt(mTextView, startIndex, startIndex); 773709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point end = getCenterPositionOfTextAt(mTextView, endIndex, endIndex); 773809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int[] viewOnScreenXY = new int[2]; 773909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView.getLocationOnScreen(viewOnScreenXY); 774009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startX = start.x + viewOnScreenXY[0]; 774109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startY = start.y + viewOnScreenXY[1]; 774209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int offsetX = end.x - start.x; 774309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 774409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Perform drag selection. 774509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressAndDragGesture( 774609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mInstrumentation, startX, startY, offsetX, 0 /* offsetY */); 774709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 774809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // No smart selection on drag selection. 774909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(startIndex, mTextView.getSelectionStart()); 775009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertEquals(endIndex, mTextView.getSelectionEnd()); 775109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 775209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 775309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki @Test 775409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki public void testSmartSelection_resetSelection() throws Throwable { 775509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki mTextView = findTextView(R.id.textview_text); 775609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki String text = "The president-elect, Filip, is coming to town tomorrow."; 775709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int startIndex = text.indexOf("president"); 775809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki int endIndex = startIndex + "president".length(); 775909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki initializeTextForSmartSelection(text); 776009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 776109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // Long-press for smart selection. Expect smart selection. 776209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki Point offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 776309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateLongPressOnView(mTextView, offset.x, offset.y); 776409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == SMARTSELECT_START 776509b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki && mTextView.getSelectionEnd() == SMARTSELECT_END); 776609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 77675a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap to reset selection. Expect tapped word to be selected. 77685a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki startIndex = text.indexOf("Filip"); 77695a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki endIndex = startIndex + "Filip".length(); 77705a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki offset = getCenterPositionOfTextAt(mTextView, startIndex, endIndex); 777109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 77725a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selStart = startIndex; 77735a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki final int selEnd = endIndex; 77745a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki PollingCheck.waitFor(() -> mTextView.getSelectionStart() == selStart 77755a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki && mTextView.getSelectionEnd() == selEnd); 777609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 77775a5227c68646efad8cd667a16ec41011415d4be6Abodunrinwa Toki // Tap one more time to dismiss the selection. 777809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki emulateClickOnView(mTextView, offset.x, offset.y); 777909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertFalse(mTextView.hasSelection()); 778009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 778109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki 77821f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 77831f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlFamilyName() { 77841f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_fontfamily); 77851f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 77861f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 77871f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 77881f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 77891f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 77901f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 77911f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlFamilyName() { 77921f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 77931f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 77941f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 77951f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 77961f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 77971f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 77981f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 77991f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlStyle() { 78001f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_style); 78011f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 78021f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78031f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 78041f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 78051f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78061f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 78071f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlStyle() { 78081f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_style); 78091f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 78101f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78111f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 78121f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 78131f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78141f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 78151f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResources_setInXmlTextAppearance() { 78161f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontresource_textAppearance); 78171f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplefont); 78181f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78191f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 78201f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 78211f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78221f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri @Test 78232d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri public void testFontResourcesXml_setInXmlWithStyle() { 78242d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_fontfamily); 78252d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 78262d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 78272d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 78282d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 78292d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_withStyle); 78302d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 78312d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri Typeface resultTypeface = mTextView.getTypeface(); 78322d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertNotEquals(resultTypeface, expected); 78332d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.create(expected, Typeface.ITALIC), resultTypeface); 78342d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri assertEquals(Typeface.ITALIC, resultTypeface.getStyle()); 78352d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri } 78362d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri 78372d962e7edbe86706a906fa6b8b23ce678de8f154Clara Bayarri @Test 78381f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri public void testFontResourcesXml_setInXmlTextAppearance() { 78391f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri mTextView = findTextView(R.id.textview_fontxmlresource_textAppearance); 78401f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri Typeface expected = mActivity.getResources().getFont(R.font.samplexmlfont); 78411f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri 78421f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri assertEquals(expected, mTextView.getTypeface()); 78431f8f61374a71ceeb67eb98cf38f85226f75d35a1Clara Bayarri } 7844ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 78455705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @Test 78465705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri @MediumTest 78475705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri public void testFontResourcesXml_restrictedContext() 78485705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri throws PackageManager.NameNotFoundException { 78495705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context restrictedContext = mActivity.createPackageContext(mActivity.getPackageName(), 78505705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.CONTEXT_RESTRICTED); 78515705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri LayoutInflater layoutInflater = (LayoutInflater) restrictedContext.getSystemService( 78525705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri Context.LAYOUT_INFLATER_SERVICE); 78535705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri View root = layoutInflater.inflate(R.layout.textview_restricted_layout, null); 78545705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 78555705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_fontfamily); 78565705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78575705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_fontfamily); 78585705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78595705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_nonFontReference); 78605705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78615705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_style); 78625705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78635705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_style); 78645705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78655705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontresource_textAppearance); 78665705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78675705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri mTextView = root.findViewById(R.id.textview_fontxmlresource_textAppearance); 78685705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri assertEquals(Typeface.DEFAULT, mTextView.getTypeface()); 78695705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri } 78705705e82619d962f029acc99ff10f0f91fbeb8e61Clara Bayarri 7871da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @UiThreadTest 7872da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @Test 7873da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir public void testFallbackLineSpacing_readsFromLayoutXml() { 7874da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mActivity.setContentView(R.layout.textview_fallbacklinespacing_layout); 7875da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_true); 7876da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7877da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7878da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_default); 7879da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7880da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7881da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_false); 7882da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertFalse(mTextView.isFallbackLineSpacing()); 7883da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir } 7884da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7885da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @UiThreadTest 7886da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @Test 7887da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir public void testFallbackLineSpacing_set_get() { 7888da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mActivity.setContentView(R.layout.textview_fallbacklinespacing_layout); 7889da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_true); 7890da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7891da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7892da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setFallbackLineSpacing(false); 7893da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertFalse(mTextView.isFallbackLineSpacing()); 7894da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7895da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setFallbackLineSpacing(true); 7896da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7897da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir } 7898da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7899da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @UiThreadTest 7900da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @Test 7901da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir public void testFallbackLineSpacing_readsFromStyleXml() { 7902da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mActivity.setContentView(R.layout.textview_fallbacklinespacing_layout); 7903da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_style_true); 7904da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7905da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7906da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_style_default); 7907da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7908da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7909da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_style_false); 7910da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertFalse(mTextView.isFallbackLineSpacing()); 7911da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir } 7912da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7913da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @UiThreadTest 7914da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir @Test 7915da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir public void testFallbackLineSpacing_textAppearance_set_get() { 7916da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mActivity.setContentView(R.layout.textview_fallbacklinespacing_layout); 7917da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView = findTextView(R.id.textview_default); 7918da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7919da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7920da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setTextAppearance(R.style.TextAppearance_FallbackLineSpacingFalse); 7921da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertFalse(mTextView.isFallbackLineSpacing()); 7922da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7923da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setTextAppearance(R.style.TextAppearance_FallbackLineSpacingTrue); 7924da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7925da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7926da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setFallbackLineSpacing(false); 7927da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setTextAppearance(R.style.TextAppearance); 7928da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertFalse(mTextView.isFallbackLineSpacing()); 7929da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 7930da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setFallbackLineSpacing(true); 7931da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir mTextView.setTextAppearance(R.style.TextAppearance); 7932da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir assertTrue(mTextView.isFallbackLineSpacing()); 7933da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir } 7934da79ffff25885bbedcf3b06ede6bda5031d2ad26Siyamed Sinir 793582d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka @UiThreadTest 793682d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka @Test 793782d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka public void testTextLayoutParam() { 793882d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka mActivity.setContentView(R.layout.textview_fallbacklinespacing_layout); 793982d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka mTextView = findTextView(R.id.textview_default); 794082d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka PrecomputedText.Params param = mTextView.getTextMetricsParams(); 794182d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 794282d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka assertEquals(mTextView.getBreakStrategy(), param.getBreakStrategy()); 794382d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka assertEquals(mTextView.getHyphenationFrequency(), param.getHyphenationFrequency()); 794482d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 794582d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka assertTrue(param.equals(mTextView.getTextMetricsParams())); 794682d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 794782d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka mTextView.setBreakStrategy( 794882d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka mTextView.getBreakStrategy() == Layout.BREAK_STRATEGY_SIMPLE 794982d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka ? Layout.BREAK_STRATEGY_BALANCED : Layout.BREAK_STRATEGY_SIMPLE); 795082d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 795182d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka assertFalse(param.equals(mTextView.getTextMetricsParams())); 795282d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 795382d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka mTextView.setTextMetricsParams(param); 795482d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka assertTrue(param.equals(mTextView.getTextMetricsParams())); 795582d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka } 795682d73119016e321a8f90347bded84e25c87a0675Seigo Nonaka 7957ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka @Test 7958ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka public void testDynamicLayoutReflowCrash_b75652829() throws Throwable { 7959ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka final SpannableStringBuilder text = new SpannableStringBuilder("abcde"); 7960ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka text.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7961ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka 7962ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mActivityRule.runOnUiThread(() -> { 7963ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView = new EditText(mActivity); 7964ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mActivity.setContentView(mTextView); 7965ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView.setText(text, BufferType.EDITABLE); 7966ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView.requestFocus(); 7967ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView.setSelected(true); 7968ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView.setTextClassifier(TextClassifier.NO_OP); 7969ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka }); 7970ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mInstrumentation.waitForIdleSync(); 7971ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka 7972ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mActivityRule.runOnUiThread(() -> { 7973ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka // Set selection and try to start action mode. 7974ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka final Bundle args = new Bundle(); 7975ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0); 7976ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka args.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, text.length()); 7977ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mTextView.performAccessibilityAction( 7978ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka AccessibilityNodeInfo.ACTION_SET_SELECTION, args); 7979ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka }); 7980ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mInstrumentation.waitForIdleSync(); 7981ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka 7982ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka mActivityRule.runOnUiThread(() -> { 7983ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka Editable editable = (Editable) mTextView.getText(); 7984ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka SpannableStringBuilder ssb = new SpannableStringBuilder("a"); 7985ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka ssb.setSpan(new UnderlineSpan(), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 7986ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka editable.replace(5, 5, ssb); 7987ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka }); 7988ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka } 7989ec43b4b5fc768b702000814377877e26d0c2005fSeigo Nonaka 799009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void initializeTextForSmartSelection(CharSequence text) throws Throwable { 799109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki assertTrue(text.length() >= SMARTSELECT_END); 7992cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mActivityRule.runOnUiThread(() -> { 7993cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mTextView.setTextIsSelectable(true); 799459aeb3c1ff371b5ed015487cbc11a15696f44d43Abodunrinwa Toki mTextView.setText(text); 7995e9e02ef957fa33a27dece143c123942d6ea7b387Abodunrinwa Toki mTextView.setTextClassifier(FAKE_TEXT_CLASSIFIER); 799659aeb3c1ff371b5ed015487cbc11a15696f44d43Abodunrinwa Toki mTextView.requestFocus(); 7997cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki }); 7998cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki mInstrumentation.waitForIdleSync(); 799909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 8000cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 800109b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateClickOnView(View view, int offsetX, int offsetY) { 800209b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateTapOnView(mInstrumentation, view, offsetX, offsetY); 800309b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 800409b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki } 8005cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 800609b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki private void emulateLongPressOnView(View view, int offsetX, int offsetY) { 800709b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki CtsTouchUtils.emulateLongPressOnView(mInstrumentation, view, offsetX, offsetY); 800809b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // TODO: Ideally, we shouldn't have to wait for a click timeout after a long-press but it 800909b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki // seems like we have a minor bug (call it inconvenience) in TextView that requires this. 801009b6eccae5812a1f72b97ceaa9f03790dfdc51c0Abodunrinwa Toki SystemClock.sleep(CLICK_TIMEOUT); 8011cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki } 8012cfe27a9a9b8580e413a15912379aae9db161c19fAbodunrinwa Toki 80139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu /** 8014069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * Some TextView attributes require non-fixed width and/or layout height. This function removes 8015069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * all other existing views from the layout leaving only one auto-size TextView (for exercising 8016069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * the auto-size behavior) which has been set up to suit the test needs. 8017cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 8018069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @param viewId The id of the view to prepare. 8019cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * @param shouldWrapLayoutContent Specifies if the layout params should wrap content 8020cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu * 8021069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu * @return a TextView configured for auto size tests. 8022cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu */ 8023069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu private TextView prepareAndRetrieveAutoSizeTestData(final int viewId, 8024cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final boolean shouldWrapLayoutContent) throws Throwable { 8025cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 8026cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 8027069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu TextView targetedTextView = (TextView) mActivity.findViewById(viewId); 8028cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu ll.removeAllViews(); 8029069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu ll.addView(targetedTextView); 8030cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu }); 8031cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 8032cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 8033069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu final TextView textView = (TextView) mActivity.findViewById(viewId); 8034cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu if (shouldWrapLayoutContent) { 8035cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu // Do not force exact width or height. 8036cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( 8037cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT, 8038cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu LinearLayout.LayoutParams.WRAP_CONTENT); 8039069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu mActivityRule.runOnUiThread(() -> { 8040069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu textView.setLayoutParams(layoutParams); 8041069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu }); 8042cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 8043cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 8044cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 8045069b4a9d9beacb7ae994d97ef44b696917822d21Andrei Stingaceanu return textView; 8046cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu } 8047cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu 8048cbd4b0d6ffb56f4506b738559cfacc93b6338604Andrei Stingaceanu /** 80499560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * Removes all existing views from the layout and adds a basic TextView (for exercising the 80509560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * ClickableSpan onClick() behavior) in order to prevent scrolling. Adds a ClickableSpan to the 80519560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * TextView and returns the ClickableSpan and position details about it to be used in individual 80529560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu * tests. 80539560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu */ 80546b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu private ClickableSpanTestDetails prepareAndRetrieveClickableSpanDetails() throws Throwable { 80556b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 80569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu LinearLayout ll = (LinearLayout) mActivity.findViewById(R.id.layout_textviewtest); 80579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.removeAllViews(); 80589560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView = new TextView(mActivity); 80599560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ll.addView(mTextView); 80609560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 80619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 80629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80639560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mockTextLink = mock(ClickableSpan.class); 80649560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu StringBuilder textViewContent = new StringBuilder(); 80659560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu String clickableString = "clickMe!"; 80669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(clickableString); 80679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int startPos = 0; 80689560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80699560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu // Insert more characters to make some room for swiping. 80709560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu for (int i = 0; i < 200; i++) { 80719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu textViewContent.append(" text"); 80729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 80739560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu SpannableString spannableString = new SpannableString(textViewContent); 80749560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu final int endPos = clickableString.length(); 80759560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu spannableString.setSpan(mockTextLink, startPos, endPos, 0); 80766b02e92df9486b4b1723473987bf025dcd18a23dAndrei Stingaceanu mActivityRule.runOnUiThread(() -> { 80779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setText(spannableString); 80789560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 80799560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu }); 80809560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mInstrumentation.waitForIdleSync(); 80819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu return new ClickableSpanTestDetails(mockTextLink, mTextView, startPos, endPos); 80839560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 80849560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80859560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private static final class ClickableSpanTestDetails { 80869560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpan mClickableSpan; 80879560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosInside; 80889560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosInside; 80899560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mXPosOutside; 80909560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int mYPosOutside; 80919560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80929560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mStartCharPos; 80939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private int mEndCharPos; 80949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private TextView mParent; 80959560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 80969560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu ClickableSpanTestDetails(ClickableSpan clickableSpan, TextView parent, 80979560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int startCharPos, int endCharPos) { 80989560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mClickableSpan = clickableSpan; 80999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mParent = parent; 81009560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mStartCharPos = startCharPos; 81019560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mEndCharPos = endCharPos; 81029560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 81039560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu calculatePositions(); 81049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 81059560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 81069560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void calculatePositions() { 810700b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) mParent.getLayout().getPrimaryHorizontal(mStartCharPos, true); 810800b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) mParent.getLayout().getPrimaryHorizontal(mEndCharPos, true); 81099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int line = mParent.getLayout().getLineForOffset(mEndCharPos); 81109560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yTop = mParent.getLayout().getLineTop(line); 81119560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu int yBottom = mParent.getLayout().getLineBottom(line); 81129560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 81139560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosInside = (xStart + xEnd) / 2; 81149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosInside = (yTop + yBottom) / 2; 81159560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mXPosOutside = xEnd + 1; 81169560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mYPosOutside = yBottom + 1; 81179560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 81189560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu } 81199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu 812057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri private MotionEvent createMouseHoverEvent(View view) { 812157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] xy = new int[2]; 812257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri view.getLocationOnScreen(xy); 812357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewWidth = view.getWidth(); 812457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int viewHeight = view.getHeight(); 812557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float x = xy[0] + viewWidth / 2.0f; 812657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri float y = xy[1] + viewHeight / 2.0f; 812757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri long eventTime = SystemClock.uptimeMillis(); 812857c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; 812957c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0] = new MotionEvent.PointerCoords(); 813057c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].x = x; 813157c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords[0].y = y; 813257c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri final int[] pointerIds = new int[1]; 813357c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerIds[0] = 0; 813457c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri return MotionEvent.obtain(0, eventTime, MotionEvent.ACTION_HOVER_MOVE, 1, pointerIds, 813557c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri pointerCoords, 0, 0, 0, 0, 0, InputDevice.SOURCE_MOUSE, 0); 813657c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri } 813757c708762722100ec4e7b4fa57c67248c5a50b66Clara Bayarri 81389560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final TextView textView) throws Throwable { 81399560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(textView)); 8140fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8141fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8142fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81439560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void layout(final int layoutId) throws Throwable { 81449560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mActivity.setContentView(layoutId)); 8145fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8146fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8147fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8148fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView findTextView(int id) { 8149fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return (TextView) mActivity.findViewById(id); 8150fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8151fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8152fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private int getAutoLinkMask(int id) { 8153fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return findTextView(id).getAutoLinkMask(); 8154fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8155fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81569560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxLines(final int lines) throws Throwable { 81579560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxLines(lines)); 81586a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir mInstrumentation.waitForIdleSync(); 81596a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir } 81606a7d70f520117b679dc0e8af433e4241b47fe8b6Siyamed Sinir 81619560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxWidth(final int pixels) throws Throwable { 81629560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxWidth(pixels)); 8163fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8164fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8165fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81669560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinWidth(final int pixels) throws Throwable { 81679560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinWidth(pixels)); 8168fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8169fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8170fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81719560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMaxHeight(final int pixels) throws Throwable { 81729560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxHeight(pixels)); 8173fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8174fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8175fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81769560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinHeight(final int pixels) throws Throwable { 81779560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinHeight(pixels)); 8178fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8179fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8180fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81819560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setMinLines(final int minLines) throws Throwable { 81829560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinLines(minLines)); 8183fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8184fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8185fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8186fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 8187fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * Convenience for {@link TextView#setText(CharSequence, BufferType)}. And 8188fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * the buffer type is fixed to SPANNABLE. 8189fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * 8190fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param tv the text view 8191fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su * @param content the content 8192fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su */ 81939560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu private void setSpannableText(final TextView tv, final String content) throws Throwable { 81949560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> tv.setText(content, BufferType.SPANNABLE)); 8195fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8196fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8197fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 81984b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLines(final int lines) throws Throwable { 81999560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLines(lines)); 8200fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8201fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8202fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82034b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHorizontallyScrolling(final boolean whether) throws Throwable { 82049560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHorizontallyScrolling(whether)); 8205fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8206fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8207fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82084b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setWidth(final int pixels) throws Throwable { 82099560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setWidth(pixels)); 8210fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8211fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8212fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82134b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setHeight(final int pixels) throws Throwable { 82149560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setHeight(pixels)); 8215fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8216fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8217fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82184b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMinEms(final int ems) throws Throwable { 82199560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMinEms(ems)); 8220fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8221fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8222fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82234b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setMaxEms(final int ems) throws Throwable { 82249560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setMaxEms(ems)); 8225fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8226fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8227fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82284b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setEms(final int ems) throws Throwable { 82299560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setEms(ems)); 8230fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8231fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8232fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 82334b645d615abed9d92ce586a135ad0c8f2e08bd48Kirill Grouchnikov private void setLineSpacing(final float add, final float mult) throws Throwable { 82349560fd0bff8ebc15f71898067d514cf1e2d3ad09Andrei Stingaceanu mActivityRule.runOnUiThread(() -> mTextView.setLineSpacing(add, mult)); 8235fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mInstrumentation.waitForIdleSync(); 8236fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8237fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8238ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki /** 8239ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * Returns the x, y coordinates of text at a specified indices relative to the position of the 8240ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * TextView. 8241ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * 8242ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param textView 8243ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param startIndex start index of the text in the textView 8244ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki * @param endIndex end index of the text in the textView 8245ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki */ 8246ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki private static Point getCenterPositionOfTextAt( 8247ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki TextView textView, int startIndex, int endIndex) { 824800b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xStart = (int) textView.getLayout().getPrimaryHorizontal(startIndex, true); 824900b7fa9a859aad62104e5e064a1f4af8fe8be0f0Roozbeh Pournader int xEnd = (int) textView.getLayout().getPrimaryHorizontal(endIndex, true); 8250ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int line = textView.getLayout().getLineForOffset(endIndex); 8251ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yTop = textView.getLayout().getLineTop(line); 8252ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki int yBottom = textView.getLayout().getLineBottom(line); 8253ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 8254ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki return new Point((xStart + xEnd) / 2 /* x */, (yTop + yBottom) / 2 /* y */); 8255ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki } 8256ad7abe36f771de18179fa1bc5487b65e12e1e7dcAbodunrinwa Toki 8257fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestSelectedRunnable implements Runnable { 8258fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 8259fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected1; 8260fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mIsSelected2; 8261fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8262fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestSelectedRunnable(TextView textview) { 8263fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 8264fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8265fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8266fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected1() { 8267fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected1; 8268fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8269fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8270fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean getIsSelected2() { 8271fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mIsSelected2; 8272fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8273fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8274fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected1() { 8275fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected1 = mTextView.isSelected(); 8276fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8277fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8278fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveIsSelected2() { 8279fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mIsSelected2 = mTextView.isSelected(); 8280fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8281fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8282fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8283fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static abstract class TestLayoutRunnable implements Runnable { 8284fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private TextView mTextView; 8285fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private Layout mLayout; 8286fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8287fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public TestLayoutRunnable(TextView textview) { 8288fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mTextView = textview; 8289fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8290fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8291fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public Layout getLayout() { 8292fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mLayout; 8293fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8294fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8295fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void saveLayout() { 8296fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mLayout = mTextView.getLayout(); 8297fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8298fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8299fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8300fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private static class MockTextWatcher implements TextWatcher { 8301fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledAfterTextChanged; 8302fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasCalledBeforeTextChanged; 8303fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su private boolean mHasOnTextChanged; 8304fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8305fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void reset(){ 8306fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = false; 8307fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = false; 8308fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = false; 8309fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8310fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8311fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledAfterTextChanged() { 8312fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledAfterTextChanged; 8313fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8314fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8315fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledBeforeTextChanged() { 8316fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasCalledBeforeTextChanged; 8317fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8318fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8319fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public boolean hasCalledOnTextChanged() { 8320fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su return mHasOnTextChanged; 8321fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8322fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8323fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void afterTextChanged(Editable s) { 8324fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledAfterTextChanged = true; 8325fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8326fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8327fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void beforeTextChanged(CharSequence s, int start, int count, int after) { 8328fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasCalledBeforeTextChanged = true; 8329fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8330fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8331fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su public void onTextChanged(CharSequence s, int start, int before, int count) { 8332fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su mHasOnTextChanged = true; 8333fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8334fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su } 8335fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su 8336fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su /** 8337277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook * A TextWatcher that converts the text to spaces whenever the text changes. 8338277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook */ 8339277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook private static class ConvertToSpacesTextWatcher implements TextWatcher { 8340277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook boolean mChangingText; 8341277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 8342277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 8343277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void beforeTextChanged(CharSequence s, int start, int count, int after) { 8344277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8345277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 8346277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 8347277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void onTextChanged(CharSequence s, int start, int before, int count) { 8348277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8349277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook 8350277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook @Override 8351277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook public void afterTextChanged(Editable s) { 8352277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Avoid infinite recursion. 8353277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook if (mChangingText) { 8354277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook return; 8355277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8356277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = true; 8357277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook // Create a string of s.length() spaces. 8358277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook StringBuilder builder = new StringBuilder(s.length()); 8359277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook for (int i = 0; i < s.length(); i++) { 8360277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook builder.append(' '); 8361277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8362277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook s.replace(0, s.length(), builder.toString()); 8363277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook mChangingText = false; 8364277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8365277fd69e9d1f08b601cd6f12ff5f13e200a6b63aJames Cook } 8366fa0bdcfa2bdacc555a6cecd0e5e0ed46afa06970Scott Su} 8367