diff --git a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
index ff40589..f0f9627 100644
--- a/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
+++ b/tests/tests/text/src/android/text/cts/StaticLayoutTest.java
@@ -47,6 +47,8 @@
 
     private static final Alignment DEFAULT_ALIGN = Alignment.ALIGN_CENTER;
 
+    private static final int ELLIPSIZE_WIDTH = 8;
+
     private StaticLayout mDefaultLayout;
     private TextPaint mDefaultPaint;
 
@@ -66,13 +68,20 @@
                 DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true);
     }
 
+    private StaticLayout createEllipsizeStaticLayout() {
+        return new StaticLayout(LAYOUT_TEXT, 0, LAYOUT_TEXT.length(), mDefaultPaint,
+                DEFAULT_OUTER_WIDTH, DEFAULT_ALIGN, SPACE_MULTI, SPACE_ADD, true,
+                TextUtils.TruncateAt.MIDDLE, ELLIPSIZE_WIDTH);
+    }
+
     /**
      * Constructor test
      */
     @TestTargets({
         @TestTargetNew(
             level = TestLevel.COMPLETE,
-            method = "StaticLayout", args = {java.lang.CharSequence.class, int.class, int.class,
+            method = "StaticLayout",
+            args = {java.lang.CharSequence.class, int.class, int.class,
                     android.text.TextPaint.class, int.class, android.text.Layout.Alignment.class,
                     float.class, float.class, boolean.class}
         ),
@@ -353,6 +362,7 @@
     @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
         + " of StaticLayout#getEllipsisCount(int) when line is out of bound")
     public void testGetEllipsisCount() {
+        mDefaultLayout = createEllipsizeStaticLayout();
         assertTrue(mDefaultLayout.getEllipsisCount(0) > 0);
         assertTrue(mDefaultLayout.getEllipsisCount(1) > 0);
 
@@ -382,6 +392,7 @@
     @ToBeFixed(bug = "1695243", explanation = "should add @throws clause into javadoc "
         + " of StaticLayout#getEllipsisStart(int) when line is out of bound")
     public void testGetEllipsisStart() {
+        mDefaultLayout = createEllipsizeStaticLayout();
         assertTrue(mDefaultLayout.getEllipsisStart(0) >= 0);
         assertTrue(mDefaultLayout.getEllipsisStart(1) >= 0);
 
diff --git a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
index eb08e7b..a7c55a1 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -48,25 +48,15 @@
 @TestTargetClass(ArrowKeyMovementMethod.class)
 public class ArrowKeyMovementMethodTest extends ActivityInstrumentationTestCase2<StubActivity> {
     private static final String THREE_LINES_TEXT = "first line\nsecond line\nlast line";
-
     private static final int END_OF_ALL_TEXT = THREE_LINES_TEXT.length();
-
     private static final int END_OF_1ST_LINE = THREE_LINES_TEXT.indexOf('\n');
-
     private static final int START_OF_2ND_LINE = END_OF_1ST_LINE + 1;
-
     private static final int END_OF_2ND_LINE = THREE_LINES_TEXT.indexOf('\n', START_OF_2ND_LINE);
-
     private static final int START_OF_3RD_LINE = END_OF_2ND_LINE + 1;
-
     private static final int SPACE_IN_2ND_LINE = THREE_LINES_TEXT.indexOf(' ', START_OF_2ND_LINE);
-
     private TextView mTextView;
-
     private ArrowKeyMovementMethod mArrowKeyMovementMethod;
-
     private Editable mEditable;
-
     private MyMetaKeyKeyListener mMetaListener;
 
     public ArrowKeyMovementMethodTest() {
@@ -140,7 +130,7 @@
     )
     @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete. There is no "
             + "document about the behaviour of this method.")
-    public void testOnTakeFocus() {
+    public void testOnTakeFocus() throws Throwable {
         /*
          * The following assertions depend on whether the TextView has a layout.
          * The text view will not get layout in setContent method but in other
@@ -151,7 +141,7 @@
          * and checking the assertion at last.
          */
         assertSelection(-1);
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_DOWN);
             }
@@ -159,7 +149,7 @@
         getInstrumentation().waitForIdleSync();
         assertSelection(END_OF_1ST_LINE);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_RIGHT);
@@ -168,7 +158,7 @@
         getInstrumentation().waitForIdleSync();
         assertSelection(END_OF_1ST_LINE);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_UP);
@@ -177,7 +167,7 @@
         getInstrumentation().waitForIdleSync();
         assertSelection(END_OF_ALL_TEXT);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_LEFT);
@@ -186,7 +176,7 @@
         getInstrumentation().waitForIdleSync();
         assertSelection(END_OF_ALL_TEXT);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 mTextView.setSingleLine();
             }
@@ -196,7 +186,7 @@
         assertNotNull(mTextView.getLayout());
         assertEquals(1, mTextView.getLayout().getLineCount());
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_DOWN);
@@ -204,7 +194,7 @@
         });
         assertSelection(END_OF_ALL_TEXT);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_RIGHT);
@@ -212,7 +202,7 @@
         });
         assertSelection(END_OF_ALL_TEXT);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_UP);
@@ -220,7 +210,7 @@
         });
         assertSelection(END_OF_ALL_TEXT);
 
-        getInstrumentation().runOnMainSync(new Runnable() {
+        runTestOnUiThread(new Runnable() {
             public void run() {
                 Selection.removeSelection(mEditable);
                 mArrowKeyMovementMethod.onTakeFocus(mTextView, mEditable, View.FOCUS_LEFT);
@@ -716,18 +706,17 @@
     @UiThreadTest
     @ToBeFixed(bug = "1400249", explanation = "There is a side effect that the "
             + "view scroll while dragging on the screen. Should be tested in functional test.")
-    public void testOnTouchEvent() {
+    public void testOnTouchEvent() throws Throwable {
         long now = SystemClock.currentThreadTimeMillis();
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
-        assertTrue(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
+        assertFalse(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
                 MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, 1, 1, 0)));
-        assertSelection(0);
+        assertSelection(SPACE_IN_2ND_LINE);
 
-        Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
-        assertTrue(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
+        assertFalse(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
                 MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, 1, 1,
                         KeyEvent.META_SHIFT_ON)));
-        assertSelection(0);
+        assertSelection(SPACE_IN_2ND_LINE);
     }
 
     @TestTargetNew(
@@ -747,13 +736,9 @@
         mTextView.requestFocus();
         assertTrue(mTextView.isFocused());
 
-        try {
-            mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
-                    MotionEvent.obtain(0, 0, MotionEvent.ACTION_UP, 1, 1, 0));
-            fail("The method did not throw NullPointerException when param textView is null.");
-        } catch (NullPointerException e) {
-            // expected
-        }
+        long now = SystemClock.currentThreadTimeMillis();
+        assertFalse(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
+                    MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, 1, 1, 0)));
     }
 
     @TestTargetNew(
@@ -769,8 +754,9 @@
     public void testOnTouchEventWithoutFocus() {
         long now = SystemClock.currentThreadTimeMillis();
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
-        assertTrue(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
+        assertFalse(mArrowKeyMovementMethod.onTouchEvent(mTextView, mEditable,
                 MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, 1, 1, 0)));
+        assertSelection(SPACE_IN_2ND_LINE);
     }
 
     @TestTargetNew(
diff --git a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
index 4b742dd..07e0164 100644
--- a/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ReplacementTransformationMethodTest.java
@@ -33,18 +33,12 @@
 @TestTargetClass(ReplacementTransformationMethod.class)
 public class ReplacementTransformationMethodTest extends
         ActivityInstrumentationTestCase2<StubActivity> {
-    private static final char[] ORIGINAL = new char[] { '0', '1' };
-
-    private static final char[] ORIGINAL_WITH_MORE_CHARS = new char[] { '0', '1', '2' };
-
-    private static final char[] ORIGINAL_WITH_SAME_CHARS = new char[] { '0', '0' };
-
-    private static final char[] REPLACEMENT = new char[] { '3', '4' };
-
-    private static final char[] REPLACEMENT_WITH_MORE_CHARS = new char[] { '3', '4', '5' };
-
-    private static final char[] REPLACEMENT_WITH_SAME_CHARS = new char[] { '3', '3' };
-
+    private final char[] ORIGINAL = new char[] { '0', '1' };
+    private final char[] ORIGINAL_WITH_MORE_CHARS = new char[] { '0', '1', '2' };
+    private final char[] ORIGINAL_WITH_SAME_CHARS = new char[] { '0', '0' };
+    private final char[] REPLACEMENT = new char[] { '3', '4' };
+    private final char[] REPLACEMENT_WITH_MORE_CHARS = new char[] { '3', '4', '5' };
+    private final char[] REPLACEMENT_WITH_SAME_CHARS = new char[] { '3', '3' };
     private EditText mEditText;
 
     public ReplacementTransformationMethodTest() {
@@ -162,7 +156,7 @@
         method.onFocusChanged(null, null, true, 0, null);
     }
 
-    private class MyReplacementTransformationMethod extends ReplacementTransformationMethod {
+    private static class MyReplacementTransformationMethod extends ReplacementTransformationMethod {
         private char[] mOriginal;
 
         private char[] mReplacement;
