1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.text.method.cts;
18 
19 
20 import android.app.Activity;
21 import android.os.SystemClock;
22 import android.test.ActivityInstrumentationTestCase2;
23 import android.text.Layout;
24 import android.text.Spannable;
25 import android.text.SpannableString;
26 import android.text.TextPaint;
27 import android.text.method.Touch;
28 import android.util.DisplayMetrics;
29 import android.view.MotionEvent;
30 import android.widget.TextView;
31 
32 public class TouchTest extends ActivityInstrumentationTestCase2<CtsActivity> {
33     private Activity mActivity;
34     private static final String LONG_TEXT = "Scrolls the specified widget to the specified " +
35             "coordinates, except constrains the X scrolling position to the horizontal regions " +
36             "of the text that will be visible after scrolling to the specified Y position." +
37             "This is the description of the test." +
38             "Scrolls the specified widget to the specified " +
39             "coordinates, except constrains the X scrolling position to the horizontal regions " +
40             "of the text that will be visible after scrolling to the specified Y position." +
41             "This is the description of the test.";
42 
43     private boolean mReturnFromTouchEvent;
44 
TouchTest()45     public TouchTest() {
46         super("com.android.cts.text", CtsActivity.class);
47     }
48 
49     @Override
setUp()50     protected void setUp() throws Exception {
51         super.setUp();
52         mActivity = getActivity();
53     }
54 
testScrollTo()55     public void testScrollTo() throws Throwable {
56         final TextView tv = new TextView(mActivity);
57         runTestOnUiThread(new Runnable() {
58             public void run() {
59                 mActivity.setContentView(tv);
60                 tv.setSingleLine(true);
61                 tv.setLines(2);
62             }
63         });
64         getInstrumentation().waitForIdleSync();
65         TextPaint paint = tv.getPaint();
66         final Layout layout = tv.getLayout();
67 
68         runTestOnUiThread(new Runnable() {
69             public void run() {
70                 tv.setText(LONG_TEXT);
71             }
72         });
73         getInstrumentation().waitForIdleSync();
74 
75         // get the total length of string
76         final int width = getTextWidth(LONG_TEXT, paint);
77 
78         runTestOnUiThread(new Runnable() {
79             public void run() {
80                 Touch.scrollTo(tv, layout, width - tv.getWidth() - 1, 0);
81             }
82         });
83         getInstrumentation().waitForIdleSync();
84         assertEquals(width - tv.getWidth() - 1, tv.getScrollX());
85         assertEquals(0, tv.getScrollY());
86 
87         // the X to which scroll is greater than the total length of string.
88         runTestOnUiThread(new Runnable() {
89             public void run() {
90                 Touch.scrollTo(tv, layout, width + 100, 5);
91             }
92         });
93         getInstrumentation().waitForIdleSync();
94         assertEquals(width - tv.getWidth(), tv.getScrollX(), 1.0f);
95         assertEquals(5, tv.getScrollY());
96 
97         runTestOnUiThread(new Runnable() {
98             public void run() {
99                 Touch.scrollTo(tv, layout, width - 10, 5);
100             }
101         });
102         getInstrumentation().waitForIdleSync();
103         assertEquals(width - tv.getWidth(), tv.getScrollX(), 1.0f);
104         assertEquals(5, tv.getScrollY());
105     }
106 
testOnTouchEvent()107     public void testOnTouchEvent() throws Throwable {
108         final TextView tv = new TextView(mActivity);
109 
110         // Create a string that is wider than the screen.
111         DisplayMetrics metrics = mActivity.getResources().getDisplayMetrics();
112         int screenWidth = metrics.widthPixels;
113         TextPaint paint = tv.getPaint();
114         String text = LONG_TEXT;
115         int textWidth = Math.round(paint.measureText(text));
116         while (textWidth < screenWidth) {
117             text += LONG_TEXT;
118             textWidth = Math.round(paint.measureText(text));
119         }
120 
121         // Drag the difference between the text width and the screen width.
122         int dragAmount = Math.min(screenWidth, textWidth - screenWidth);
123         assertTrue(dragAmount > 0);
124         final String finalText = text;
125         final SpannableString spannable = new SpannableString(finalText);
126         runTestOnUiThread(new Runnable() {
127             public void run() {
128                 mActivity.setContentView(tv);
129                 tv.setSingleLine(true);
130                 tv.setText(finalText);
131             }
132         });
133         getInstrumentation().waitForIdleSync();
134 
135         long downTime = SystemClock.uptimeMillis();
136         long eventTime = SystemClock.uptimeMillis();
137         final MotionEvent event1 = MotionEvent.obtain(downTime, eventTime,
138                 MotionEvent.ACTION_DOWN, dragAmount, 0, 0);
139         final MotionEvent event2 = MotionEvent.obtain(downTime, eventTime,
140                 MotionEvent.ACTION_MOVE, 0, 0, 0);
141         final MotionEvent event3 = MotionEvent.obtain(downTime, eventTime,
142                 MotionEvent.ACTION_UP, 0, 0, 0);
143         assertEquals(0, tv.getScrollX());
144         assertEquals(0, tv.getScrollY());
145         mReturnFromTouchEvent = false;
146         runTestOnUiThread(new Runnable() {
147             public void run() {
148                 mReturnFromTouchEvent = Touch.onTouchEvent(tv, spannable, event1);
149             }
150         });
151         getInstrumentation().waitForIdleSync();
152         assertTrue(mReturnFromTouchEvent);
153         // TextView has not been scrolled.
154         assertEquals(0, tv.getScrollX());
155         assertEquals(0, tv.getScrollY());
156         assertEquals(0, Touch.getInitialScrollX(tv, spannable));
157         assertEquals(0, Touch.getInitialScrollY(tv, spannable));
158 
159         mReturnFromTouchEvent = false;
160         runTestOnUiThread(new Runnable() {
161             public void run() {
162                 mReturnFromTouchEvent = Touch.onTouchEvent(tv, spannable, event2);
163             }
164         });
165         getInstrumentation().waitForIdleSync();
166         assertTrue(mReturnFromTouchEvent);
167         // TextView has been scrolled.
168         assertEquals(dragAmount, tv.getScrollX());
169         assertEquals(0, tv.getScrollY());
170         assertEquals(0, Touch.getInitialScrollX(tv, spannable));
171         assertEquals(0, Touch.getInitialScrollY(tv, spannable));
172 
173         mReturnFromTouchEvent = false;
174         runTestOnUiThread(new Runnable() {
175             public void run() {
176                 mReturnFromTouchEvent = Touch.onTouchEvent(tv, spannable, event3);
177             }
178         });
179         getInstrumentation().waitForIdleSync();
180         assertTrue(mReturnFromTouchEvent);
181         // TextView has not been scrolled.
182         assertEquals(dragAmount, tv.getScrollX());
183         assertEquals(0, tv.getScrollY());
184         assertEquals(-1, Touch.getInitialScrollX(tv, spannable));
185         assertEquals(-1, Touch.getInitialScrollY(tv, spannable));
186     }
187 
getTextWidth(String str, TextPaint paint)188     private int getTextWidth(String str, TextPaint paint) {
189         float totalWidth = 0f;
190         float[] widths = new float[str.length()];
191         paint.getTextWidths(str, widths);
192         for (float f : widths) {
193             totalWidth += f;
194         }
195         return (int) totalWidth;
196     }
197 }
198