1 /* 2 * Copyright (C) 2009 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.widget.cts; 18 19 import com.android.cts.stub.R; 20 21 22 import org.xmlpull.v1.XmlPullParser; 23 import org.xmlpull.v1.XmlPullParserException; 24 25 import android.app.Activity; 26 import android.content.Context; 27 import android.cts.util.PollingCheck; 28 import android.test.ActivityInstrumentationTestCase2; 29 import android.test.UiThreadTest; 30 import android.util.AttributeSet; 31 import android.util.Xml; 32 import android.view.MotionEvent; 33 import android.view.View; 34 import android.widget.ImageView; 35 import android.widget.SlidingDrawer; 36 import android.widget.TextView; 37 import android.widget.SlidingDrawer.OnDrawerCloseListener; 38 import android.widget.SlidingDrawer.OnDrawerOpenListener; 39 import android.widget.SlidingDrawer.OnDrawerScrollListener; 40 41 import java.io.IOException; 42 43 /** 44 * Test {@link SlidingDrawer}. 45 */ 46 public class SlidingDrawerTest 47 extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> { 48 49 private static final long TEST_TIMEOUT = 5000L; 50 private Activity mActivity; 51 private Object mLock; 52 53 public SlidingDrawerTest() { 54 super("com.android.cts.stub", SlidingDrawerStubActivity.class); 55 } 56 57 @Override 58 protected void setUp() throws Exception { 59 super.setUp(); 60 mActivity = getActivity(); 61 mLock = new Object(); 62 } 63 64 public void testConstructor() throws XmlPullParserException, IOException { 65 XmlPullParser parser = mActivity.getResources().getLayout(R.layout.sliding_drawer_layout); 66 AttributeSet attrs = Xml.asAttributeSet(parser); 67 68 try { 69 new SlidingDrawer(mActivity, attrs); 70 fail("did not throw IllegalArgumentException"); 71 } catch (IllegalArgumentException e) { 72 // expected 73 } 74 75 try { 76 new SlidingDrawer(mActivity, attrs, 0); 77 fail("did not throw IllegalArgumentException"); 78 } catch (IllegalArgumentException e) { 79 // expected 80 } 81 } 82 83 public void testGetHandle() { 84 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 85 View handle = drawer.getHandle(); 86 assertTrue(handle instanceof ImageView); 87 assertEquals(R.id.handle, handle.getId()); 88 } 89 90 public void testGetContent() { 91 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 92 View content = drawer.getContent(); 93 assertTrue(content instanceof TextView); 94 assertEquals(R.id.content, content.getId()); 95 } 96 97 @UiThreadTest 98 public void testOpenAndClose() { 99 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 100 View content = drawer.getContent(); 101 assertFalse(drawer.isOpened()); 102 assertEquals(View.GONE, content.getVisibility()); 103 104 drawer.open(); 105 assertTrue(drawer.isOpened()); 106 assertEquals(View.VISIBLE, content.getVisibility()); 107 108 drawer.close(); 109 assertFalse(drawer.isOpened()); 110 assertEquals(View.GONE, content.getVisibility()); 111 } 112 113 public void testAnimateOpenAndClose() throws Throwable { 114 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 115 View content = drawer.getContent(); 116 assertFalse(drawer.isMoving()); 117 assertFalse(drawer.isOpened()); 118 assertEquals(View.GONE, content.getVisibility()); 119 120 runTestOnUiThread(new Runnable() { 121 public void run() { 122 drawer.animateOpen(); 123 } 124 }); 125 assertTrue(drawer.isMoving()); 126 assertOpened(false, drawer); 127 assertEquals(View.GONE, content.getVisibility()); 128 129 new PollingCheck() { 130 @Override 131 protected boolean check() { 132 return !drawer.isMoving(); 133 } 134 }.run(); 135 assertOpened(true, drawer); 136 assertEquals(View.VISIBLE, content.getVisibility()); 137 138 runTestOnUiThread(new Runnable() { 139 public void run() { 140 drawer.animateClose(); 141 } 142 }); 143 assertTrue(drawer.isMoving()); 144 assertOpened(true, drawer); 145 assertEquals(View.GONE, content.getVisibility()); 146 147 new PollingCheck() { 148 @Override 149 protected boolean check() { 150 return !drawer.isMoving(); 151 } 152 }.run(); 153 assertOpened(false, drawer); 154 assertEquals(View.GONE, content.getVisibility()); 155 } 156 157 public void testAnimateToggle() throws Throwable { 158 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 159 View content = drawer.getContent(); 160 assertFalse(drawer.isMoving()); 161 assertFalse(drawer.isOpened()); 162 assertEquals(View.GONE, content.getVisibility()); 163 164 runTestOnUiThread(new Runnable() { 165 public void run() { 166 drawer.animateToggle(); 167 } 168 }); 169 assertTrue(drawer.isMoving()); 170 assertOpened(false, drawer); 171 assertEquals(View.GONE, content.getVisibility()); 172 173 new PollingCheck() { 174 @Override 175 protected boolean check() { 176 return !drawer.isMoving(); 177 } 178 }.run(); 179 assertOpened(true, drawer); 180 assertEquals(View.VISIBLE, content.getVisibility()); 181 182 runTestOnUiThread(new Runnable() { 183 public void run() { 184 drawer.animateToggle(); 185 } 186 }); 187 assertTrue(drawer.isMoving()); 188 assertOpened(true, drawer); 189 assertEquals(View.GONE, content.getVisibility()); 190 191 new PollingCheck() { 192 @Override 193 protected boolean check() { 194 return !drawer.isMoving(); 195 } 196 }.run(); 197 assertOpened(false, drawer); 198 assertEquals(View.GONE, content.getVisibility()); 199 } 200 201 private void assertOpened(final boolean opened, final SlidingDrawer drawer) { 202 new PollingCheck() { 203 @Override 204 protected boolean check() { 205 return drawer.isOpened() == opened; 206 } 207 }.run(); 208 } 209 210 @UiThreadTest 211 public void testToggle() { 212 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 213 View content = drawer.getContent(); 214 assertFalse(drawer.isOpened()); 215 assertEquals(View.GONE, content.getVisibility()); 216 217 drawer.toggle(); 218 assertTrue(drawer.isOpened()); 219 assertEquals(View.VISIBLE, content.getVisibility()); 220 221 drawer.toggle(); 222 assertFalse(drawer.isOpened()); 223 assertEquals(View.GONE, content.getVisibility()); 224 } 225 226 @UiThreadTest 227 public void testLockAndUnlock() { 228 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 229 View handle = drawer.getHandle(); 230 View content = drawer.getContent(); 231 assertFalse(drawer.isOpened()); 232 assertEquals(View.GONE, content.getVisibility()); 233 234 handle.performClick(); 235 assertTrue(drawer.isOpened()); 236 assertEquals(View.VISIBLE, content.getVisibility()); 237 238 handle.performClick(); 239 assertFalse(drawer.isOpened()); 240 assertEquals(View.GONE, content.getVisibility()); 241 242 drawer.lock(); 243 handle.performClick(); 244 assertFalse(drawer.isOpened()); 245 assertEquals(View.GONE, content.getVisibility()); 246 247 drawer.unlock(); 248 handle.performClick(); 249 assertTrue(drawer.isOpened()); 250 assertEquals(View.VISIBLE, content.getVisibility()); 251 } 252 253 @UiThreadTest 254 public void testSetOnDrawerOpenListener() { 255 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 256 MockOnDrawerOpenListener listener = new MockOnDrawerOpenListener(); 257 drawer.setOnDrawerOpenListener(listener); 258 259 assertFalse(listener.hadOpenedDrawer()); 260 261 drawer.open(); 262 assertTrue(listener.hadOpenedDrawer()); 263 } 264 265 @UiThreadTest 266 public void testSetOnDrawerCloseListener() { 267 SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 268 MockOnDrawerCloseListener listener = new MockOnDrawerCloseListener(); 269 drawer.setOnDrawerCloseListener(listener); 270 271 assertFalse(listener.hadClosedDrawer()); 272 273 drawer.open(); 274 assertFalse(listener.hadClosedDrawer()); 275 276 drawer.close(); 277 assertTrue(listener.hadClosedDrawer()); 278 } 279 280 public void testSetOnDrawerScrollListener() throws Throwable { 281 final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer); 282 MockOnDrawerScrollListener listener = new MockOnDrawerScrollListener(); 283 drawer.setOnDrawerScrollListener(listener); 284 assertFalse(listener.hadStartedScroll()); 285 assertFalse(listener.hadEndedScroll()); 286 287 runTestOnUiThread(new Runnable() { 288 public void run() { 289 drawer.animateOpen(); 290 } 291 }); 292 if ( !listener.hadStartedScroll() ) { 293 synchronized (mLock) { 294 mLock.wait(TEST_TIMEOUT); 295 } 296 } 297 assertTrue(listener.hadStartedScroll()); 298 299 if ( !listener.hadEndedScroll() ) { 300 synchronized (mLock) { 301 mLock.wait(TEST_TIMEOUT); 302 } 303 } 304 assertTrue(listener.hadStartedScroll()); 305 assertTrue(listener.hadEndedScroll()); 306 } 307 308 public void testOnLayout() { 309 // onLayout() is implementation details, do NOT test 310 } 311 312 public void testOnMeasure() { 313 // onMeasure() is implementation details, do NOT test 314 } 315 316 public void testOnFinishInflate() { 317 // onFinishInflate() is implementation details, do NOT test 318 } 319 320 public void testDispatchDraw() { 321 // dispatchDraw() is implementation details, do NOT test 322 } 323 324 public void testOnInterceptTouchEvent() { 325 // onInterceptTouchEvent() is implementation details, do NOT test 326 } 327 328 public void testOnTouchEvent() { 329 // onTouchEvent() is implementation details, do NOT test 330 } 331 332 private static final class MockOnDrawerOpenListener implements OnDrawerOpenListener { 333 private boolean mHadOpenedDrawer = false; 334 335 public void onDrawerOpened() { 336 mHadOpenedDrawer = true; 337 } 338 339 public boolean hadOpenedDrawer() { 340 return mHadOpenedDrawer; 341 } 342 } 343 344 private static final class MockOnDrawerCloseListener implements OnDrawerCloseListener { 345 private boolean mHadClosedDrawer = false; 346 347 public void onDrawerClosed() { 348 mHadClosedDrawer = true; 349 } 350 351 public boolean hadClosedDrawer() { 352 return mHadClosedDrawer; 353 } 354 } 355 356 private final class MockOnDrawerScrollListener implements OnDrawerScrollListener { 357 private boolean mHadEndedScroll = false; 358 private boolean mHadStartedScroll = false; 359 360 public void onScrollEnded() { 361 synchronized (mLock) { 362 assertTrue(mHadStartedScroll); 363 mHadEndedScroll = true; 364 mLock.notify(); 365 } 366 } 367 368 public void onScrollStarted() { 369 synchronized (mLock) { 370 mHadStartedScroll = true; 371 mLock.notify(); 372 } 373 } 374 375 public boolean hadEndedScroll() { 376 return mHadEndedScroll; 377 } 378 379 public boolean hadStartedScroll() { 380 return mHadStartedScroll; 381 } 382 } 383 } 384