Integrate unsubmitted cupcake change 149110:
	   CTS: add test case for anroid.widget.SlidingDrawer
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 9cd2caf..1a48c6c 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -135,6 +135,14 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.widget.cts.SlidingDrawerStubActivity"
+            android:label="SlidingDrawerStubActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.view.cts.UsingViewsStubActivity"
             android:label="Using Views Test">
             <intent-filter>
diff --git a/tests/res/layout/sliding_drawer_layout.xml b/tests/res/layout/sliding_drawer_layout.xml
new file mode 100644
index 0000000..df70c92
--- /dev/null
+++ b/tests/res/layout/sliding_drawer_layout.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <SlidingDrawer
+        android:id="@+id/drawer"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:animateOnClick="false"
+
+        android:handle="@+id/handle"
+        android:content="@+id/content">
+
+        <ImageView
+            android:id="@id/handle"
+            android:background="#FF00FF00"
+            android:layout_width="88dip"
+            android:layout_height="44dip" />
+
+        <TextView
+            android:id="@id/content"
+            android:background="#FF0000FF"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:text="@string/hello_world" />
+
+    </SlidingDrawer>
+
+</RelativeLayout>
diff --git a/tests/src/android/widget/cts/SlidingDrawerStubActivity.java b/tests/src/android/widget/cts/SlidingDrawerStubActivity.java
new file mode 100644
index 0000000..d19b9b1
--- /dev/null
+++ b/tests/src/android/widget/cts/SlidingDrawerStubActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.stub.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SlidingDrawerStubActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sliding_drawer_layout);
+    }
+}
diff --git a/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
new file mode 100644
index 0000000..3207a15
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/SlidingDrawerTest.java
@@ -0,0 +1,526 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.widget.cts;
+
+import com.android.cts.stub.R;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.app.Activity;
+import android.content.Context;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.util.AttributeSet;
+import android.util.Xml;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.animation.cts.DelayedCheck;
+import android.widget.ImageView;
+import android.widget.SlidingDrawer;
+import android.widget.TextView;
+import android.widget.SlidingDrawer.OnDrawerCloseListener;
+import android.widget.SlidingDrawer.OnDrawerOpenListener;
+import android.widget.SlidingDrawer.OnDrawerScrollListener;
+
+import java.io.IOException;
+
+/**
+ * Test {@link SlidingDrawer}.
+ */
+@TestTargetClass(SlidingDrawer.class)
+public class SlidingDrawerTest
+        extends ActivityInstrumentationTestCase2<SlidingDrawerStubActivity> {
+
+    private static final long TEST_TIMEOUT = 5000L;
+    private Activity mActivity;
+    private Object mLock;
+
+    public SlidingDrawerTest() {
+        super("com.android.cts.stub", SlidingDrawerStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        mLock = new Object();
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "SlidingDrawer",
+            args = {Context.class, AttributeSet.class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "SlidingDrawer",
+            args = {Context.class, AttributeSet.class, int.class}
+        )
+    })
+    public void testConstructor() throws XmlPullParserException, IOException {
+        XmlPullParser parser = mActivity.getResources().getLayout(R.layout.sliding_drawer_layout);
+        AttributeSet attrs = Xml.asAttributeSet(parser);
+
+        try {
+            new SlidingDrawer(mActivity, attrs);
+            fail("did not throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+
+        try {
+            new SlidingDrawer(mActivity, attrs, 0);
+            fail("did not throw IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // expected
+        }
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getHandle",
+        args = {}
+    )
+    public void testGetHandle() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View handle = drawer.getHandle();
+        assertTrue(handle instanceof ImageView);
+        assertEquals(R.id.handle, handle.getId());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "getContent",
+        args = {}
+    )
+    public void testGetContent() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View content = drawer.getContent();
+        assertTrue(content instanceof TextView);
+        assertEquals(R.id.content, content.getId());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "open",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "close",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isOpened",
+            args = {}
+        )
+    })
+    @UiThreadTest
+    public void testOpenAndClose() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View content = drawer.getContent();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        drawer.open();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+
+        drawer.close();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "animateOpen",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "animateClose",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isOpened",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isMoving",
+            args = {}
+        )
+    })
+    public void testAnimateOpenAndClose() throws Throwable {
+        final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View content = drawer.getContent();
+        assertFalse(drawer.isMoving());
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                drawer.animateOpen();
+            }
+        });
+        assertTrue(drawer.isMoving());
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        new DelayedCheck() {
+            @Override
+            protected boolean check() {
+                return !drawer.isMoving();
+            }
+        }.run();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                drawer.animateClose();
+            }
+        });
+        assertTrue(drawer.isMoving());
+        assertTrue(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        new DelayedCheck() {
+            @Override
+            protected boolean check() {
+                return !drawer.isMoving();
+            }
+        }.run();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "animateToggle",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isOpened",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isMoving",
+            args = {}
+        )
+    })
+    public void testAnimateToggle() throws Throwable {
+        final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View content = drawer.getContent();
+        assertFalse(drawer.isMoving());
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                drawer.animateToggle();
+            }
+        });
+        assertTrue(drawer.isMoving());
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        new DelayedCheck() {
+            @Override
+            protected boolean check() {
+                return !drawer.isMoving();
+            }
+        }.run();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                drawer.animateToggle();
+            }
+        });
+        assertTrue(drawer.isMoving());
+        assertTrue(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        new DelayedCheck() {
+            @Override
+            protected boolean check() {
+                return !drawer.isMoving();
+            }
+        }.run();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "toggle",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "isOpened",
+            args = {}
+        )
+    })
+    @UiThreadTest
+    public void testToggle() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View content = drawer.getContent();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        drawer.toggle();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+
+        drawer.toggle();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+    }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "lock",
+            args = {}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "unlock",
+            args = {}
+        )
+    })
+    @UiThreadTest
+    public void testLockAndUnlock() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        View handle = drawer.getHandle();
+        View content = drawer.getContent();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        handle.performClick();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+
+        handle.performClick();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        drawer.lock();
+        handle.performClick();
+        assertFalse(drawer.isOpened());
+        assertEquals(View.GONE, content.getVisibility());
+
+        drawer.unlock();
+        handle.performClick();
+        assertTrue(drawer.isOpened());
+        assertEquals(View.VISIBLE, content.getVisibility());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setOnDrawerOpenListener",
+        args = {android.widget.SlidingDrawer.OnDrawerOpenListener.class}
+    )
+    @UiThreadTest
+    public void testSetOnDrawerOpenListener() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        MockOnDrawerOpenListener listener = new MockOnDrawerOpenListener();
+        drawer.setOnDrawerOpenListener(listener);
+
+        assertFalse(listener.hadOpenedDrawer());
+
+        drawer.open();
+        assertTrue(listener.hadOpenedDrawer());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setOnDrawerCloseListener",
+        args = {android.widget.SlidingDrawer.OnDrawerCloseListener.class}
+    )
+    @UiThreadTest
+    public void testSetOnDrawerCloseListener() {
+        SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        MockOnDrawerCloseListener listener = new MockOnDrawerCloseListener();
+        drawer.setOnDrawerCloseListener(listener);
+
+        assertFalse(listener.hadClosedDrawer());
+
+        drawer.open();
+        assertFalse(listener.hadClosedDrawer());
+
+        drawer.close();
+        assertTrue(listener.hadClosedDrawer());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.COMPLETE,
+        method = "setOnDrawerScrollListener",
+        args = {android.widget.SlidingDrawer.OnDrawerScrollListener.class}
+    )
+    public void testSetOnDrawerScrollListener() throws Throwable {
+        final SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
+        MockOnDrawerScrollListener listener = new MockOnDrawerScrollListener();
+        drawer.setOnDrawerScrollListener(listener);
+        assertFalse(listener.hadStartedScroll());
+        assertFalse(listener.hadEndedScroll());
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                drawer.animateOpen();
+            }
+        });
+        if ( !listener.hadStartedScroll() ) {
+            synchronized (mLock) {
+                mLock.wait(TEST_TIMEOUT);
+            }
+        }
+        assertTrue(listener.hadStartedScroll());
+
+        if ( !listener.hadEndedScroll() ) {
+            synchronized (mLock) {
+                mLock.wait(TEST_TIMEOUT);
+            }
+        }
+        assertTrue(listener.hadStartedScroll());
+        assertTrue(listener.hadEndedScroll());
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "onLayout",
+        args = {boolean.class, int.class, int.class, int.class, int.class}
+    )
+    public void testOnLayout() {
+        // onLayout() is implementation details, do NOT test
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "onMeasure",
+        args = {int.class, int.class}
+    )
+    public void testOnMeasure() {
+        // onMeasure() is implementation details, do NOT test
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "onFinishInflate",
+        args = {}
+    )
+    public void testOnFinishInflate() {
+        // onFinishInflate() is implementation details, do NOT test
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "dispatchDraw",
+        args = {android.graphics.Canvas.class}
+    )
+    public void testDispatchDraw() {
+        // dispatchDraw() is implementation details, do NOT test
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "onInterceptTouchEvent",
+        args = {MotionEvent.class}
+    )
+    public void testOnInterceptTouchEvent() {
+        // onInterceptTouchEvent() is implementation details, do NOT test
+    }
+
+    @TestTargetNew(
+        level = TestLevel.NOT_NECESSARY,
+        method = "onTouchEvent",
+        args = {MotionEvent.class}
+    )
+    public void testOnTouchEvent() {
+        // onTouchEvent() is implementation details, do NOT test
+    }
+
+    private static final class MockOnDrawerOpenListener implements OnDrawerOpenListener {
+        private boolean mHadOpenedDrawer = false;
+
+        public void onDrawerOpened() {
+            mHadOpenedDrawer = true;
+        }
+
+        public boolean hadOpenedDrawer() {
+            return mHadOpenedDrawer;
+        }
+    }
+
+    private static final class MockOnDrawerCloseListener implements OnDrawerCloseListener {
+        private boolean mHadClosedDrawer = false;
+
+        public void onDrawerClosed() {
+            mHadClosedDrawer = true;
+        }
+
+        public boolean hadClosedDrawer() {
+            return mHadClosedDrawer;
+        }
+    }
+
+    private final class MockOnDrawerScrollListener implements OnDrawerScrollListener {
+        private boolean mHadEndedScroll = false;
+        private boolean mHadStartedScroll = false;
+
+        public void onScrollEnded() {
+            synchronized (mLock) {
+                assertTrue(mHadStartedScroll);
+                mHadEndedScroll = true;
+                mLock.notify();
+            }
+        }
+
+        public void onScrollStarted() {
+            synchronized (mLock) {
+                mHadStartedScroll = true;
+                mLock.notify();
+            }
+        }
+
+        public boolean hadEndedScroll() {
+            return mHadEndedScroll;
+        }
+
+        public boolean hadStartedScroll() {
+            return mHadStartedScroll;
+        }
+    }
+}