Merge "Fixed HeaderViewListAdapterTest"
diff --git a/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java b/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
index a2acefe..8001130 100644
--- a/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
+++ b/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
@@ -77,7 +77,7 @@
                 TAG_PACKAGE, TAG_CLASS, TAG_INTERFACE, TAG_IMPLEMENTS, TAG_CONSTRUCTOR,
                 TAG_METHOD, TAG_PARAM, TAG_EXCEPTION, TAG_FIELD }));
     }
-    
+
     public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
     {
         int type;
@@ -87,7 +87,7 @@
         if (type != XmlPullParser.START_TAG) {
             throw new XmlPullParserException("No start tag found");
         }
-        
+
         if (!parser.getName().equals(firstElementName)) {
             throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
                     ", expected " + firstElementName);
@@ -109,7 +109,7 @@
             while ((type=parser.next()) != XmlPullParser.START_TAG
                        && type != XmlPullParser.END_DOCUMENT
                        && type != XmlPullParser.END_TAG) {
-                
+
             }
 
             if (type == XmlPullParser.END_TAG) {
@@ -144,14 +144,14 @@
                 currentClass.addConstructor(constructor);
                 currentMethod = constructor;
             } else if (tagname.equals(TAG_METHOD)) {
-                currentMethod = loadMethodInfo(parser);
+                currentMethod = loadMethodInfo(currentClass.getClassName(), parser);
                 currentClass.addMethod(currentMethod);
             } else if (tagname.equals(TAG_PARAM)) {
                 currentMethod.addParam(parser.getAttributeValue(null, ATTRIBUTE_TYPE));
             } else if (tagname.equals(TAG_EXCEPTION)) {
                 currentMethod.addException(parser.getAttributeValue(null, ATTRIBUTE_TYPE));
             } else if (tagname.equals(TAG_FIELD)) {
-                JDiffField field = loadFieldInfo(parser);
+                JDiffField field = loadFieldInfo(currentClass.getClassName(), parser);
                 currentClass.addField(field);
             } else {
                 throw new RuntimeException(
@@ -179,25 +179,28 @@
     /**
      * Load field information from xml to memory.
      *
+     * @param className of the class being examined which will be shown in error messages
+     * @param parser The XmlPullParser which carries the xml information.
      * @return the new field
      */
-    private JDiffField loadFieldInfo(XmlPullParser parser) {
+    private JDiffField loadFieldInfo(String className, XmlPullParser parser) {
         String fieldName = parser.getAttributeValue(null, ATTRIBUTE_NAME);
         String fieldType = parser.getAttributeValue(null, ATTRIBUTE_TYPE);
-        int modifier = jdiffModifierToReflectionFormat(parser);
+        int modifier = jdiffModifierToReflectionFormat(className, parser);
         return new JDiffField(fieldName, fieldType, modifier);
     }
 
     /**
      * Load method information from xml to memory.
      *
+     * @param className of the class being examined which will be shown in error messages
      * @param parser The XmlPullParser which carries the xml information.
      * @return the newly loaded method.
      */
-    private JDiffMethod loadMethodInfo(XmlPullParser parser) {
+    private JDiffMethod loadMethodInfo(String className, XmlPullParser parser) {
         String methodName = parser.getAttributeValue(null, ATTRIBUTE_NAME);
         String returnType = parser.getAttributeValue(null, ATTRIBUTE_RETURN);
-        int modifier = jdiffModifierToReflectionFormat(parser);
+        int modifier = jdiffModifierToReflectionFormat(className, parser);
         return new JDiffMethod(methodName, modifier, returnType);
     }
 
@@ -210,10 +213,9 @@
      */
     private JDiffConstructor loadConstructorInfo(XmlPullParser parser,
                                                  JDiffClassDescription currentClass) {
-        int modifier = jdiffModifierToReflectionFormat(parser);
-        JDiffConstructor constructor = new JDiffConstructor(currentClass.getClassName(), modifier);
-
-        return constructor;
+        String name = currentClass.getClassName();
+        int modifier = jdiffModifierToReflectionFormat(name, parser);
+        return new JDiffConstructor(name, modifier);
     }
 
     /**
@@ -231,7 +233,7 @@
         JDiffClassDescription currentClass = new JDiffClassDescription(pkg,
                                                                        className,
                                                                        resultObserver);
-        currentClass.setModifier(jdiffModifierToReflectionFormat(parser));
+        currentClass.setModifier(jdiffModifierToReflectionFormat(className, parser));
         currentClass.setType(isInterface ? JDiffClassDescription.JDiffType.INTERFACE :
                              JDiffClassDescription.JDiffType.CLASS);
         currentClass.setExtendsClass(parser.getAttributeValue(null, ATTRIBUTE_EXTENDS));
@@ -241,11 +243,12 @@
     /**
      * Convert string modifier to int modifier.
      *
+     * @param name of the class/method/field being examined which will be shown in error messages
      * @param key modifier name
      * @param value modifier value
      * @return converted modifier value
      */
-    private static int modifierDescriptionToReflectedType(String key, String value){
+    private static int modifierDescriptionToReflectedType(String name, String key, String value) {
         if (key.equals(MODIFIER_ABSTRACT)) {
             return value.equals("true") ? Modifier.ABSTRACT : 0;
         } else if (key.equals(MODIFIER_FINAL)) {
@@ -262,8 +265,7 @@
             return value.equals("true") ? Modifier.VOLATILE : 0;
         } else if (key.equals(MODIFIER_VISIBILITY)) {
             if (value.equals(MODIFIER_PRIVATE)) {
-                throw new RuntimeException(
-                        "should not be private method/field here");
+                throw new RuntimeException("Private visibility found in API spec: " + name);
             } else if (value.equals(MODIFIER_PROTECTED)) {
                 return Modifier.PROTECTED;
             } else if (value.equals(MODIFIER_PUBLIC)) {
@@ -273,8 +275,7 @@
                 // which is package private. We should return 0 for this modifier.
                 return 0;
             } else {
-                throw new RuntimeException(
-                        "Unknow modifier:" + value);
+                throw new RuntimeException("Unknown modifier found in API spec: " + value);
             }
         }
         return 0;
@@ -283,13 +284,14 @@
     /**
      * Transfer string modifier to int one.
      *
+     * @param name of the class/method/field being examined which will be shown in error messages
      * @param parser XML resource parser
      * @return converted modifier
      */
-    private static int jdiffModifierToReflectionFormat(XmlPullParser parser){
+    private static int jdiffModifierToReflectionFormat(String name, XmlPullParser parser){
         int modifier = 0;
         for (int i = 0;i < parser.getAttributeCount();i++) {
-            modifier |= modifierDescriptionToReflectedType(parser.getAttributeName(i),
+            modifier |= modifierDescriptionToReflectedType(name, parser.getAttributeName(i),
                     parser.getAttributeValue(i));
         }
         return modifier;
diff --git a/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java b/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java
index 90b08b8..9c81cef 100644
--- a/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java
+++ b/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java
@@ -111,16 +111,9 @@
             if (!excludeSet.contains(f.getName())) {
                 try {
                     sigTest.start(r.getXml(f.getInt(rClass)));
-                } catch (NotFoundException e) {
-                    throw new RuntimeException(e);
-                } catch (IllegalArgumentException e) {
-                    throw new RuntimeException(e);
-                } catch (IllegalAccessException e) {
-                    throw new RuntimeException(e);
-                } catch (XmlPullParserException e) {
-                    throw new RuntimeException(e);
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
+                } catch (Exception e) {
+                    mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION, e.getMessage(),
+                            e.getMessage());
                 }
             }
         }
diff --git a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
index 74eda03..13be1d5 100644
--- a/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/AvoidXfermodeTest.java
@@ -47,7 +47,6 @@
     )
     @ToBeFixed(bug = "2034547",
                explanation = "AvoidXfermode does not work as expected with tolerance 0.")
-    @KnownFailure(value="bug 2136225")
     public void testAvoidXfermode() {
         Paint greenPaint;
         Paint redAvoidingGreenPaint;
diff --git a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
index e92e1ec..7f55ddb 100644
--- a/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/ColorMatrixTest.java
@@ -33,6 +33,8 @@
         15, 16, 17, 18, 19
     };
 
+    private static final float TOLERANCE = 0.0000001f;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -199,22 +201,22 @@
 
         mColorMatrix.setRotate(0, 180);
         float[] ret = mColorMatrix.getArray();
-        assertEquals(-1.0f, ret[6]);
-        assertEquals(-1.0f, ret[12]);
-        assertEquals(-8.742278E-8f, ret[7]);
-        assertEquals(8.742278E-8f, ret[11]);
+        assertEquals(-1.0f, ret[6], TOLERANCE);
+        assertEquals(-1.0f, ret[12], TOLERANCE);
+        assertEquals(0, ret[7], TOLERANCE);
+        assertEquals(0, ret[11], TOLERANCE);
 
         mColorMatrix.setRotate(1, 180);
-        assertEquals(-1.0f, ret[0]);
-        assertEquals(-1.0f, ret[17]);
-        assertEquals(-8.742278E-8f, ret[2]);
-        assertEquals(8.742278E-8f, ret[15]);
+        assertEquals(-1.0f, ret[0], TOLERANCE);
+        assertEquals(-1.0f, ret[12], TOLERANCE);
+        assertEquals(0, ret[2], TOLERANCE);
+        assertEquals(0, ret[10], TOLERANCE);
 
         mColorMatrix.setRotate(2, 180);
-        assertEquals(-1.0f, ret[0]);
-        assertEquals(-1.0f, ret[6]);
-        assertEquals(-8.742278E-8f, ret[1]);
-        assertEquals(8.742278E-8f, ret[5]);
+        assertEquals(-1.0f, ret[0], TOLERANCE);
+        assertEquals(-1.0f, ret[6], TOLERANCE);
+        assertEquals(0, ret[1], TOLERANCE);
+        assertEquals(0, ret[5], TOLERANCE);
     }
 
     @TestTargets({
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
index 5f1072b..979d24c 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -233,7 +233,7 @@
         if (LOGV) Log.v(TAG, "Wait for preview callback");
         if (!mPreviewDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
             // timeout could be expected or unexpected. The caller will decide.
-            if (LOGV) Log.v(TAG, "waitForPreviewDone: timeout");
+            Log.v(TAG, "waitForPreviewDone: timeout");
         }
         mPreviewDone.close();
     }
@@ -241,7 +241,7 @@
     private void waitForFocusDone() {
         if (!mFocusDone.block(WAIT_FOR_FOCUS_TO_COMPLETE)) {
             // timeout could be expected or unexpected. The caller will decide.
-            if (LOGV) Log.v(TAG, "waitForFocusDone: timeout");
+            Log.v(TAG, "waitForFocusDone: timeout");
         }
         mFocusDone.close();
     }
@@ -249,7 +249,7 @@
     private void waitForSnapshotDone() {
         if (!mSnapshotDone.block(WAIT_FOR_SNAPSHOT_TO_COMPLETE)) {
             // timeout could be expected or unexpected. The caller will decide.
-            if (LOGV) Log.v(TAG, "waitForSnapshotDone: timeout");
+            Log.v(TAG, "waitForSnapshotDone: timeout");
         }
         mSnapshotDone.close();
     }
@@ -819,4 +819,69 @@
             recorder.release();
         }
     }
+
+    @TestTargets({
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "addCallbackBuffer",
+            args = {byte[].class}
+        ),
+        @TestTargetNew(
+            level = TestLevel.COMPLETE,
+            method = "setPreviewCallbackWithBuffer",
+            args = {android.hardware.Camera.PreviewCallback.class}
+        )
+    })
+    public void testPreviewCallbackWithBuffer() throws Exception {
+        initializeMessageLooper();
+        SurfaceHolder surfaceHolder;
+        surfaceHolder = CameraStubActivity.mSurfaceView.getHolder();
+        mCamera.setPreviewDisplay(surfaceHolder);
+        Size size = mCamera.getParameters().getPreviewSize();
+        PreviewCallbackWithBuffer callback = new PreviewCallbackWithBuffer();
+        callback.mBuffer1 = new byte[size.width * size.height * 3 / 2 + 1];
+        callback.mBuffer2 = new byte[size.width * size.height * 3 / 2 + 1];
+        callback.mBuffer3 = new byte[size.width * size.height * 3 / 2 + 1];
+
+        // Test if we can get the preview callbacks with specified buffers.
+        mCamera.addCallbackBuffer(callback.mBuffer1);
+        mCamera.addCallbackBuffer(callback.mBuffer2);
+        mCamera.setPreviewCallbackWithBuffer(callback);
+        mCamera.startPreview();
+        waitForPreviewDone();
+        assertEquals(1, callback.mNumCbWithBuffer1);
+        assertEquals(1, callback.mNumCbWithBuffer2);
+        assertEquals(0, callback.mNumCbWithBuffer3);
+
+        // Test if preview callback with buffer still works during preview.
+        callback.mNumCbWithBuffer1 = callback.mNumCbWithBuffer2 = 0;
+        mCamera.addCallbackBuffer(callback.mBuffer3);
+        waitForPreviewDone();
+        assertEquals(0, callback.mNumCbWithBuffer1);
+        assertEquals(0, callback.mNumCbWithBuffer2);
+        assertEquals(1, callback.mNumCbWithBuffer3);
+        terminateMessageLooper();
+    }
+
+    private final class PreviewCallbackWithBuffer implements PreviewCallback {
+        public int mNumCbWithBuffer1, mNumCbWithBuffer2, mNumCbWithBuffer3;
+        public byte[] mBuffer1, mBuffer2, mBuffer3;
+        public void onPreviewFrame(byte[] data, Camera camera) {
+            assert(data != null);
+            if (data == mBuffer1) {
+                mNumCbWithBuffer1++;
+            } else if (data == mBuffer2) {
+                mNumCbWithBuffer2++;
+            } else if (data == mBuffer3) {
+                mNumCbWithBuffer3++;
+            } else {
+                fail("Invalid byte array.");
+            }
+
+            if ((mNumCbWithBuffer1 == 1 && mNumCbWithBuffer2 == 1)
+                    || mNumCbWithBuffer3 == 1) {
+                mPreviewDone.open();
+            }
+        }
+    }
 }
diff --git a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
index 8fecc39..af420b4 100644
--- a/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ExpandableListViewTest.java
@@ -16,6 +16,14 @@
 
 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 dalvik.annotation.ToBeFixed;
+
 import org.xmlpull.v1.XmlPullParser;
 
 import android.content.Context;
@@ -36,16 +44,6 @@
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ExpandableListView.OnGroupClickListener;
-import android.widget.ExpandableListView.OnGroupCollapseListener;
-import android.widget.ExpandableListView.OnGroupExpandListener;
-
-import com.android.cts.stub.R;
-
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.ToBeFixed;
 
 @TestTargetClass(ExpandableListView.class)
 public class ExpandableListViewTest extends AndroidTestCase {
@@ -334,9 +332,19 @@
         expandableListView.setAdapter(new MockExpandableListAdapter());
 
         assertEquals(0, expandableListView.getExpandableListPosition(0));
-        assertEquals(1L<<32, expandableListView.getExpandableListPosition(1));
-        assertEquals(2L<<32, expandableListView.getExpandableListPosition(2));
-        assertEquals(3L<<32, expandableListView.getExpandableListPosition(3));
+
+        // Group 0 is not expanded, position 1 is invalid
+        assertEquals(ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                expandableListView.getExpandableListPosition(1));
+
+        // Position 1 becomes valid when group 0 is expanded
+        expandableListView.expandGroup(0);
+        assertEquals(ExpandableListView.getPackedPositionForChild(0, 0),
+                expandableListView.getExpandableListPosition(1));
+
+        // Position 2 is still invalid (only one child).
+        assertEquals(ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                expandableListView.getExpandableListPosition(2));
     }
 
     @TestTargetNew(
@@ -780,6 +788,7 @@
             super(context, attrs, defStyle);
         }
 
+        @Override
         protected void dispatchDraw(Canvas canvas) {
             super.dispatchDraw(canvas);
         }