Merge "Add CtsHostsideNetworkTestsApp2 to testcase list" into nyc-dev
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
index 4bd494d..abe8bf0 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -137,6 +137,7 @@
         Collections.addAll(paths, context.getExternalCacheDirs());
         Collections.addAll(paths, context.getExternalFilesDirs(null));
         Collections.addAll(paths, context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES));
+        Collections.addAll(paths, context.getExternalMediaDirs());
         Collections.addAll(paths, context.getObbDirs());
         return paths;
     }
@@ -146,6 +147,7 @@
         Collections.addAll(paths, context.getExternalCacheDirs());
         Collections.addAll(paths, context.getExternalFilesDirs(null));
         Collections.addAll(paths, context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES));
+        Collections.addAll(paths, context.getExternalMediaDirs());
         return paths;
     }
 
diff --git a/libs/migration/src/com/android/cts/migration/MigrationHelper.java b/libs/migration/src/com/android/cts/migration/MigrationHelper.java
index 5fa0ff8..0595486 100644
--- a/libs/migration/src/com/android/cts/migration/MigrationHelper.java
+++ b/libs/migration/src/com/android/cts/migration/MigrationHelper.java
@@ -1,9 +1,11 @@
 package com.android.cts.migration;
 
 import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.log.LogUtil.CLog;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -27,7 +29,9 @@
             Method method = cls.getMethod("getTestsDir");
             File dir = (File) method.invoke(instance);
             File file = new File(dir, filename);
+            CLog.i("Looking for test file %s in dir %s", filename, dir.getAbsolutePath());
             if (file.exists()) {
+                CLog.i("File %s found", filename);
                 return file;
             }
         } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |
@@ -40,7 +44,9 @@
             Object helper = builder.invoke(null, mBuild);
             Method method = cls.getMethod("getTestApp", String.class);
             File file = (File) method.invoke(helper, filename);
+            CLog.i("Looking for test file %s as %s", filename, file.getAbsolutePath());
             if (file.exists()) {
+                CLog.i("File %s found", filename);
                 return file;
             }
         } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |
diff --git a/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java b/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java
index cc0afe4..8163520 100644
--- a/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java
+++ b/tests/tests/telecom/src/android/telecom/cts/TelecomAvailabilityTest.java
@@ -25,6 +25,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
+import android.telecom.TelecomManager;
 import android.test.InstrumentationTestCase;
 import android.util.Log;
 
@@ -98,6 +99,24 @@
                 telephonyMatches);
     }
 
+    public void testTelecomCanManageBlockedNumbers() {
+        if (!shouldTestTelecom(mContext)) {
+            return;
+        }
+
+        final TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class);
+        final Intent intent = telecomManager.createManageBlockedNumbersIntent();
+        assertNotNull(intent);
+
+        final List<ResolveInfo> activities =
+                mPackageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        assertEquals(1, activities.size());
+        for (ResolveInfo resolveInfo : activities) {
+            assertNotNull(resolveInfo.activityInfo);
+            assertEquals(TELECOM_PACKAGE_NAME, resolveInfo.activityInfo.packageName);
+        }
+    }
+
     /**
      * @return The {@link PackageInfo} of the only app named {@code PACKAGE_NAME}.
      */
diff --git a/tests/tests/transition/res/layout/scene7.xml b/tests/tests/transition/res/layout/scene7.xml
new file mode 100644
index 0000000..72c74e8
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene7.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:transitionName="green"
+          android:id="@+id/greenSquare" />
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="hello"
+              android:text="@string/hello"
+              android:id="@+id/hello"/>
+</RelativeLayout>
diff --git a/tests/tests/transition/res/layout/scene8.xml b/tests/tests/transition/res/layout/scene8.xml
new file mode 100644
index 0000000..69674ee
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene8.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="match_parent"
+                android:layout_height="match_parent"
+                android:transitionName="holder"
+                android:id="@+id/holder">
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#F00"
+          android:transitionName="red"
+          android:id="@+id/greenSquare" />
+    <View android:layout_width="10dp"
+          android:layout_height="10dp"
+          android:background="#0F0"
+          android:transitionName="green"
+          android:id="@+id/redSquare"
+          android:layout_below="@+id/greenSquare" />
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:transitionName="hello"
+              android:text="@string/hello"
+              android:id="@+id/hello"/>
+</RelativeLayout>
diff --git a/tests/tests/transition/src/android/transition/cts/ArcMotionTest.java b/tests/tests/transition/src/android/transition/cts/ArcMotionTest.java
new file mode 100644
index 0000000..6cb5c1c
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/ArcMotionTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2016 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.transition.cts;
+
+import android.graphics.Path;
+import android.graphics.PathMeasure;
+import android.transition.ArcMotion;
+
+import junit.framework.TestCase;
+
+public class ArcMotionTest extends TestCase {
+
+    public void test90Quadrants() throws Throwable {
+        ArcMotion arcMotion = new ArcMotion();
+        arcMotion.setMaximumAngle(90);
+
+        Path expected = arcWithPoint(0, 100, 100, 0, 100, 100);
+        Path path = arcMotion.getPath(0, 100, 100, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(100, 0, 0, -100, 100, -100);
+        path = arcMotion.getPath(100, 0, 0, -100);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(0, -100, -100, 0, -100, -100);
+        path = arcMotion.getPath(0, -100, -100, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(-100, 0, 0, 100, -100, 100);
+        path = arcMotion.getPath(-100, 0, 0, 100);
+        assertPathMatches(expected, path);
+    }
+
+    public void test345Triangles() throws Throwable {
+        // 3-4-5 triangles are easy to calculate the control points
+        ArcMotion arcMotion = new ArcMotion();
+        arcMotion.setMaximumAngle(90);
+        Path expected;
+        Path path;
+
+        expected = arcWithPoint(0, 120, 160, 0, 125, 120);
+        path = arcMotion.getPath(0, 120, 160, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(0, 160, 120, 0, 120, 125);
+        path = arcMotion.getPath(0, 160, 120, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(-120, 0, 0, 160, -120, 125);
+        path = arcMotion.getPath(-120, 0, 0, 160);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(-160, 0, 0, 120, -125, 120);
+        path = arcMotion.getPath(-160, 0, 0, 120);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(0, -120, -160, 0, -125, -120);
+        path = arcMotion.getPath(0, -120, -160, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(0, -160, -120, 0, -120, -125);
+        path = arcMotion.getPath(0, -160, -120, 0);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(120, 0, 0, -160, 120, -125);
+        path = arcMotion.getPath(120, 0, 0, -160);
+        assertPathMatches(expected, path);
+
+        expected = arcWithPoint(160, 0, 0, -120, 125, -120);
+        path = arcMotion.getPath(160, 0, 0, -120);
+        assertPathMatches(expected, path);
+    }
+
+    private Path arcWithPoint(float startX, float startY, float endX, float endY,
+            float eX, float eY) {
+        float c1x = (eX + startX)/2;
+        float c1y = (eY + startY)/2;
+        float c2x = (eX + endX)/2;
+        float c2y = (eY + endY)/2;
+        Path path = new Path();
+        path.moveTo(startX, startY);
+        path.cubicTo(c1x, c1y, c2x, c2y, endX, endY);
+        return path;
+    }
+
+    private void assertPathMatches(Path expectedPath, Path path) {
+        PathMeasure expectedMeasure = new PathMeasure(expectedPath, false);
+        PathMeasure pathMeasure = new PathMeasure(path, false);
+
+        float expectedLength = expectedMeasure.getLength();
+        assertEquals(expectedLength, pathMeasure.getLength(), 0.01f);
+
+        float minLength = Math.min(expectedLength, pathMeasure.getLength());
+
+        float pos[] = new float[2];
+
+        float increment = minLength / 5f;
+        for (float along = 0; along <= minLength; along += increment) {
+            expectedMeasure.getPosTan(along, pos, null);
+            float expectedX = pos[0];
+            float expectedY = pos[1];
+
+            pathMeasure.getPosTan(along, pos, null);
+            assertEquals(expectedX, pos[0], 0.01f);
+            assertEquals(expectedY, pos[1], 0.01f);
+        }
+    }
+
+    public void testMaximumAngle() throws Throwable {
+        ArcMotion arcMotion = new ArcMotion();
+        arcMotion.setMaximumAngle(45f);
+        assertEquals(45f, arcMotion.getMaximumAngle());
+
+        float ratio = (float) Math.tan(Math.PI/8);
+        float ex = 50 + (50 * ratio);
+        float ey = ex;
+
+        Path expected = arcWithPoint(0, 100, 100, 0, ex, ey);
+        Path path = arcMotion.getPath(0, 100, 100, 0);
+        assertPathMatches(expected, path);
+    }
+
+    public void testMinimumHorizontalAngle() throws Throwable {
+        ArcMotion arcMotion = new ArcMotion();
+        arcMotion.setMinimumHorizontalAngle(45);
+        assertEquals(45f, arcMotion.getMinimumHorizontalAngle());
+
+        float ey = (float)(Math.tan(Math.PI/8) * 50);
+        float ex = 50;
+        Path expected = arcWithPoint(0, 0, 100, 0, ex, ey);
+        Path path = arcMotion.getPath(0, 0, 100, 0);
+        assertPathMatches(expected, path);
+
+        // Pretty much the same, but follows a different path.
+        expected = arcWithPoint(0, 0, 100.001f, 0, ex, ey);
+        path = arcMotion.getPath(0, 0, 100.001f, 0);
+        assertPathMatches(expected, path);
+    }
+
+    public void testMinimumVerticalAngle() throws Throwable {
+        ArcMotion arcMotion = new ArcMotion();
+        arcMotion.setMinimumVerticalAngle(45);
+        assertEquals(45f, arcMotion.getMinimumVerticalAngle());
+
+        float ex = (float)(Math.tan(Math.PI/8) * 50);
+        float ey = 50;
+        Path expected = arcWithPoint(0, 0, 0, 100, ex, ey);
+        Path path = arcMotion.getPath(0, 0, 0, 100);
+        assertPathMatches(expected, path);
+
+        // Pretty much the same, but follows a different path.
+        expected = arcWithPoint(0, 0, 0, 100.001f, ex, ey);
+        path = arcMotion.getPath(0, 0, 0, 100.001f);
+        assertPathMatches(expected, path);
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
index 9f41f21..56ba44b 100644
--- a/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
+++ b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
@@ -23,7 +23,6 @@
 import android.transition.TransitionManager;
 import android.transition.TransitionValues;
 import android.transition.Visibility;
-import android.transition.cts.R;
 import android.view.Choreographer;
 import android.view.Choreographer.FrameCallback;
 import android.view.View;
@@ -76,11 +75,50 @@
         listener.endLatch.await(waitMillis, TimeUnit.MILLISECONDS);
     }
 
-    protected void startTransition(final int layoutId) throws Throwable {
+    protected View loadLayout(final int layout) throws Throwable {
+        View[] root = new View[1];
+
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
-                Scene scene = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
+                root[0] = mActivity.getLayoutInflater().inflate(layout, mSceneRoot, false);
+            }
+        });
+
+        return root[0];
+    }
+
+    protected Scene loadScene(final View layout) throws Throwable {
+        Scene[] scene = new Scene[1];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                scene[0] = new Scene(mSceneRoot, layout);
+            }
+        });
+
+        return scene[0];
+    }
+
+    protected Scene loadScene(final int layoutId) throws Throwable {
+        Scene scene[] = new Scene[1];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                scene[0] = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
+            }
+        });
+        return scene[0];
+    }
+
+    protected void startTransition(final int layoutId) throws Throwable {
+        startTransition(loadScene(layoutId));
+    }
+
+    protected void startTransition(final Scene scene) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
                 TransitionManager.go(scene, mTransition);
             }
         });
@@ -97,16 +135,35 @@
     }
 
     protected void enterScene(final int layoutId) throws Throwable {
+        enterScene(loadScene(layoutId));
+    }
+
+    protected void enterScene(final Scene scene) throws Throwable {
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
-                Scene scene = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
                 scene.enter();
             }
         });
         getInstrumentation().waitForIdleSync();
     }
 
+    protected void exitScene(final Scene scene) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                scene.exit();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+    }
+
+    protected void resetListener() {
+        mTransition.removeListener(mListener);
+        mListener = new SimpleTransitionListener();
+        mTransition.addListener(mListener);
+    }
+
     // Waits at least one frame and it could be more. The animated values should have changed
     // from the previously recorded values by the end of this method.
     protected void waitForAnimationFrame() throws Throwable {
@@ -128,7 +185,6 @@
     public class TestTransition extends Visibility {
 
         public TestTransition() {
-            setDuration(200);
         }
 
         @Override
diff --git a/tests/tests/transition/src/android/transition/cts/SceneTest.java b/tests/tests/transition/src/android/transition/cts/SceneTest.java
new file mode 100644
index 0000000..2785714
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/SceneTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2016 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.transition.cts;
+
+import android.transition.Scene;
+import android.view.View;
+
+public class SceneTest extends BaseTransitionTest {
+
+    public SceneTest() {
+    }
+
+    public void testDynamicConstructor() throws Throwable {
+        Scene scene = new Scene(mSceneRoot);
+        assertEquals(mSceneRoot, scene.getSceneRoot());
+        CallCheck enterCheck = new CallCheck() {
+            @Override
+            public void run() {
+                super.run();
+                mActivity.getLayoutInflater().inflate(R.layout.scene1, mSceneRoot, true);
+            }
+        };
+        scene.setEnterAction(enterCheck);
+        CallCheck exitCheck = new CallCheck();
+        scene.setExitAction(exitCheck);
+        enterScene(scene);
+
+        assertTrue(enterCheck.wasRun);
+        assertFalse(exitCheck.wasRun);
+
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+        assertNotNull(redSquare);
+
+        exitScene(scene);
+        assertNotNull(mSceneRoot.findViewById(R.id.redSquare));
+        assertTrue(exitCheck.wasRun);
+
+        enterScene(R.layout.scene4);
+        assertNull(mSceneRoot.findViewById(R.id.redSquare));
+    }
+
+    public void testViewConstructor() throws Throwable {
+        View view = loadLayout(R.layout.scene1);
+        Scene scene = new Scene(mSceneRoot, view);
+        assertEquals(mSceneRoot, scene.getSceneRoot());
+        CallCheck enterCheck = new CallCheck();
+        scene.setEnterAction(enterCheck);
+        CallCheck exitCheck = new CallCheck();
+        scene.setExitAction(exitCheck);
+        enterScene(scene);
+
+        assertTrue(enterCheck.wasRun);
+        assertFalse(exitCheck.wasRun);
+
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+        assertNotNull(redSquare);
+
+        exitScene(scene);
+        assertNotNull(mSceneRoot.findViewById(R.id.redSquare));
+        assertTrue(exitCheck.wasRun);
+
+        enterScene(R.layout.scene4);
+        assertNull(mSceneRoot.findViewById(R.id.redSquare));
+    }
+
+    public void testFactory() throws Throwable {
+        Scene scene = loadScene(R.layout.scene1);
+        assertEquals(mSceneRoot, scene.getSceneRoot());
+        CallCheck enterCheck = new CallCheck();
+        scene.setEnterAction(enterCheck);
+        CallCheck exitCheck = new CallCheck();
+        scene.setExitAction(exitCheck);
+        enterScene(scene);
+
+        assertTrue(enterCheck.wasRun);
+        assertFalse(exitCheck.wasRun);
+
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+        assertNotNull(redSquare);
+
+        exitScene(scene);
+        assertNotNull(mSceneRoot.findViewById(R.id.redSquare));
+        assertTrue(exitCheck.wasRun);
+        enterScene(R.layout.scene4);
+        assertNull(mSceneRoot.findViewById(R.id.redSquare));
+    }
+
+    private static class CallCheck implements Runnable {
+        public boolean wasRun;
+
+        @Override
+        public void run() {
+            wasRun = true;
+        }
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionSetTest.java b/tests/tests/transition/src/android/transition/cts/TransitionSetTest.java
new file mode 100644
index 0000000..3afe812
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/TransitionSetTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2016 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.transition.cts;
+
+import android.transition.ChangeBounds;
+import android.transition.Fade;
+import android.transition.TransitionSet;
+
+import java.util.concurrent.TimeUnit;
+
+public class TransitionSetTest extends BaseTransitionTest {
+
+    public void testTransitionTogether() throws Throwable {
+        TransitionSet transitionSet = new TransitionSet();
+        Fade fade = new Fade();
+        SimpleTransitionListener fadeListener = new SimpleTransitionListener();
+        fade.addListener(fadeListener);
+        ChangeBounds changeBounds = new ChangeBounds();
+        SimpleTransitionListener changeBoundsListener = new SimpleTransitionListener();
+        changeBounds.addListener(changeBoundsListener);
+        transitionSet.addTransition(fade);
+        transitionSet.addTransition(changeBounds);
+        mTransition = transitionSet;
+        resetListener();
+
+        assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
+        enterScene(R.layout.scene1);
+        startTransition(R.layout.scene3);
+        assertTrue(fadeListener.startLatch.await(0, TimeUnit.MILLISECONDS));
+        assertTrue(changeBoundsListener.startLatch.await(0, TimeUnit.MILLISECONDS));
+
+        endTransition();
+    }
+
+    public void testTransitionSequentially() throws Throwable {
+        TransitionSet transitionSet = new TransitionSet();
+        Fade fade = new Fade();
+        SimpleTransitionListener fadeListener = new SimpleTransitionListener();
+        fade.addListener(fadeListener);
+        ChangeBounds changeBounds = new ChangeBounds();
+        SimpleTransitionListener changeBoundsListener = new SimpleTransitionListener();
+        changeBounds.addListener(changeBoundsListener);
+        transitionSet.addTransition(fade);
+        transitionSet.addTransition(changeBounds);
+        mTransition = transitionSet;
+        resetListener();
+
+        assertEquals(TransitionSet.ORDERING_TOGETHER, transitionSet.getOrdering());
+        transitionSet.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
+        assertEquals(TransitionSet.ORDERING_SEQUENTIAL, transitionSet.getOrdering());
+
+        enterScene(R.layout.scene1);
+        startTransition(R.layout.scene3);
+        assertTrue(fadeListener.startLatch.await(0, TimeUnit.MILLISECONDS));
+        assertEquals(1, changeBoundsListener.startLatch.getCount());
+        assertTrue(fadeListener.endLatch.await(400, TimeUnit.MILLISECONDS));
+        assertTrue(changeBoundsListener.startLatch.await(0, TimeUnit.MILLISECONDS));
+        endTransition();
+    }
+
+    public void testTransitionCount() throws Throwable {
+        TransitionSet transitionSet = new TransitionSet();
+        assertEquals(0, transitionSet.getTransitionCount());
+
+        Fade fade = new Fade();
+        ChangeBounds changeBounds = new ChangeBounds();
+        transitionSet.addTransition(fade);
+        transitionSet.addTransition(changeBounds);
+
+        assertEquals(2, transitionSet.getTransitionCount());
+        assertSame(fade, transitionSet.getTransitionAt(0));
+        assertSame(changeBounds, transitionSet.getTransitionAt(1));
+
+        transitionSet.removeTransition(fade);
+
+        assertEquals(1, transitionSet.getTransitionCount());
+        assertSame(changeBounds, transitionSet.getTransitionAt(0));
+
+        transitionSet.removeTransition(fade); // remove one that isn't there
+        assertEquals(1, transitionSet.getTransitionCount());
+        assertSame(changeBounds, transitionSet.getTransitionAt(0));
+    }
+}
+
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionTest.java b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
index e87be84..9ae568a 100644
--- a/tests/tests/transition/src/android/transition/cts/TransitionTest.java
+++ b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
@@ -15,19 +15,31 @@
  */
 package android.transition.cts;
 
-import android.transition.cts.R;
-
-import android.animation.ObjectAnimator;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.graphics.Rect;
+import android.os.Debug;
+import android.os.SystemClock;
+import android.transition.ArcMotion;
 import android.transition.AutoTransition;
+import android.transition.ChangeBounds;
+import android.transition.PathMotion;
 import android.transition.Scene;
+import android.transition.Transition;
+import android.transition.Transition.EpicenterCallback;
+import android.transition.Transition.TransitionListener;
 import android.transition.TransitionManager;
+import android.transition.TransitionPropagation;
 import android.transition.TransitionValues;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 public class TransitionTest extends BaseTransitionTest {
@@ -84,6 +96,8 @@
 
     public void testAddTargetId() throws Throwable {
         enterScene(R.layout.scene4);
+        assertNotNull(mTransition.getTargetIds());
+        assertTrue(mTransition.getTargetIds().isEmpty());
         mTransition.addTarget(R.id.holder);
         mTransition.addTarget(R.id.hello);
         assertEquals(2, mTransition.getTargetIds().size());
@@ -111,6 +125,7 @@
 
     public void testAddTargetClass() throws Throwable {
         enterScene(R.layout.scene4);
+        assertNull(mTransition.getTargetTypes());
         mTransition.addTarget(RelativeLayout.class);
         mTransition.addTarget(TextView.class);
         assertEquals(2, mTransition.getTargetTypes().size());
@@ -194,6 +209,7 @@
 
     public void testAddTargetName() throws Throwable {
         enterScene(R.layout.scene4);
+        assertNull(mTransition.getTargetNames());
         mTransition.addTarget("red");
         mTransition.addTarget("holder");
         assertEquals(2, mTransition.getTargetNames().size());
@@ -224,6 +240,7 @@
     public void testIsTransitionRequired() throws Throwable {
         enterScene(R.layout.scene1);
         mTransition = new NotRequiredTransition();
+        resetListener();
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -236,6 +253,268 @@
         endTransition();
     }
 
+    public void testCanRemoveViews() throws Throwable {
+        enterScene(R.layout.scene1);
+        assertFalse(mTransition.canRemoveViews());
+        mTransition.addListener(new TransitionListener() {
+            @Override
+            public void onTransitionStart(Transition transition) {
+                assertTrue(transition.canRemoveViews());
+            }
+
+            @Override
+            public void onTransitionEnd(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionCancel(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionPause(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionResume(Transition transition) {
+            }
+        });
+        startTransition(R.layout.scene2);
+    }
+
+    public void testExcludeChildrenView() throws Throwable {
+        View layout1 = loadLayout(R.layout.scene1);
+        Scene scene1 = loadScene(layout1);
+        enterScene(R.layout.scene1);
+        View holder1 = layout1.findViewById(R.id.holder);
+        mTransition.excludeChildren(holder1, true);
+        View layout2 = loadLayout(R.layout.scene2);
+        Scene scene2 = loadScene(layout2);
+        View holder2 = layout2.findViewById(R.id.holder);
+        mTransition.excludeChildren(holder2, true);
+        startTransition(scene2);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        mTransition.excludeChildren(holder1, false); // remove it
+        mTransition.excludeChildren(holder2, false); // remove it
+        resetListener();
+        startTransition(scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // it is running as expected
+        endTransition();
+    }
+
+    public void testExcludeChildrenId() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition.excludeChildren(R.id.holder, true);
+        startTransition(R.layout.scene2);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        resetListener();
+        mTransition.excludeChildren(R.id.holder, false); // remove it
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // It is running
+        endTransition();
+    }
+
+    public void testExcludeTargetView() throws Throwable {
+        View layout1 = loadLayout(R.layout.scene1);
+        Scene scene1 = loadScene(layout1);
+        enterScene(R.layout.scene1);
+        View redSquare1 = layout1.findViewById(R.id.redSquare);
+        mTransition.excludeTarget(redSquare1, true);
+        startTransition(R.layout.scene7);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        mTransition.excludeTarget(redSquare1, false); // remove it
+        resetListener();
+        startTransition(scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // it is running as expected
+        endTransition();
+    }
+
+    public void testExcludeTargetId() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition.excludeTarget(R.id.redSquare, true);
+        startTransition(R.layout.scene7);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        resetListener();
+        mTransition.excludeTarget(R.id.redSquare, false); // remove it
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // It is running
+        endTransition();
+    }
+
+    public void testExcludeTargetClass() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition.excludeTarget(TextView.class, true);
+        startTransition(R.layout.scene3);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        resetListener();
+        mTransition.excludeTarget(TextView.class, false); // remove it
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // It is running
+        endTransition();
+    }
+
+    public void testExcludeTargetName() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition.excludeTarget("hello", true);
+        startTransition(R.layout.scene3);
+        waitForEnd(0); // Should already be ended, since no children are transitioning
+
+        resetListener();
+        mTransition.excludeTarget("hello", false); // remove it
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount()); // It is running
+        endTransition();
+    }
+
+    public void testDuration() throws Throwable {
+        assertEquals(-1, mTransition.getDuration());
+        enterScene(R.layout.scene1);
+        mTransition.setDuration(500);
+        assertEquals(500, mTransition.getDuration());
+        startTransition(R.layout.scene3);
+        long startTime = SystemClock.uptimeMillis();
+        waitForEnd(600);
+        long endTime = SystemClock.uptimeMillis();
+        assertEquals(500, endTime - startTime, 100);
+    }
+
+    public void testEpicenter() throws Throwable {
+        EpicenterCallback callback = new EpicenterCallback() {
+            @Override
+            public Rect onGetEpicenter(Transition transition) {
+                return new Rect(0, 0, 1, 1);
+            }
+        };
+        mTransition.setEpicenterCallback(callback);
+        assertEquals(callback, mTransition.getEpicenterCallback());
+    }
+
+    public void testInterpolator() throws Throwable {
+        enterScene(R.layout.scene1);
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+        CaptureAnimatorTransition transition = new CaptureAnimatorTransition();
+        assertNull(transition.getInterpolator());
+        AccelerateInterpolator interpolator = new AccelerateInterpolator();
+        transition.setInterpolator(interpolator);
+        assertSame(interpolator, transition.getInterpolator());
+        mTransition = transition;
+        resetListener();
+        startTransition(R.layout.scene4);
+        assertFalse(transition.animators.isEmpty());
+        Animator animator = transition.animators.get(redSquare);
+        AnimationStartListener listener = transition.listeners.get(redSquare);
+        assertTrue(listener.startLatch.await(100, TimeUnit.MILLISECONDS));
+        assertSame(interpolator, animator.getInterpolator());
+        endTransition();
+    }
+
+    public void testName() throws Throwable {
+        assertEquals("android.transition.cts.BaseTransitionTest$TestTransition",
+                mTransition.getName());
+    }
+
+    public void testPathMotion() throws Throwable {
+        PathMotion pathMotion = new ArcMotion();
+        mTransition.setPathMotion(pathMotion);
+        assertEquals(pathMotion, mTransition.getPathMotion());
+    }
+
+    public void testPropagation() throws Throwable {
+        enterScene(R.layout.scene1);
+        CaptureAnimatorTransition transition = new CaptureAnimatorTransition();
+        mTransition = transition;
+        TransitionPropagation yPropagation = new TransitionPropagation() {
+            private static final String TOP = "top value";
+            private final String[] PROPERTIES = {TOP};
+
+            @Override
+            public long getStartDelay(ViewGroup viewGroup, Transition transition,
+                    TransitionValues startValues, TransitionValues endValues) {
+                int startTop = startValues == null ? 0 : (Integer) startValues.values.get(TOP);
+                int endTop = endValues == null ? 0 : (Integer) endValues.values.get(TOP);
+                return (startTop == 0) ? endTop : startTop;
+            }
+
+            @Override
+            public void captureValues(TransitionValues transitionValues) {
+                if (transitionValues.view != null) {
+                    transitionValues.values.put(TOP, transitionValues.view.getTop());
+                }
+            }
+
+            @Override
+            public String[] getPropagationProperties() {
+                return PROPERTIES;
+            }
+        };
+        mTransition.setPropagation(yPropagation);
+        resetListener();
+
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+        View greenSquare = mActivity.findViewById(R.id.greenSquare);
+        int diffTop = greenSquare.getTop() - redSquare.getTop();
+        startTransition(R.layout.scene4);
+        Animator redSquareAnimator = transition.animators.get(redSquare);
+        Animator greenSquareAnimator = transition.animators.get(greenSquare);
+        AnimationStartListener listener = transition.listeners.get(redSquare);
+        assertTrue(listener.startLatch.await(100, TimeUnit.MILLISECONDS));
+        assertEquals(0, redSquareAnimator.getStartDelay());
+        assertEquals(diffTop, greenSquareAnimator.getStartDelay());
+        endTransition();
+    }
+
+    public void testStartDelay() throws Throwable {
+        CaptureAnimatorTransition transition = new CaptureAnimatorTransition();
+        mTransition = transition;
+        resetListener();
+        enterScene(R.layout.scene1);
+        View redSquare = mActivity.findViewById(R.id.redSquare);
+
+        assertEquals(-1, mTransition.getStartDelay());
+        mTransition.setStartDelay(200);
+        assertEquals(200, mTransition.getStartDelay());
+
+        startTransition(R.layout.scene4);
+
+        Animator animator = transition.animators.get(redSquare);
+        assertFalse(animator.isRunning());
+        AnimationStartListener listener = transition.listeners.get(redSquare);
+        assertTrue(listener.startLatch.await(250, TimeUnit.MILLISECONDS));
+        endTransition();
+    }
+
+    public void testTransitionValues() throws Throwable {
+        enterScene(R.layout.scene1);
+        mTransition = new CheckTransitionValuesTransition();
+        mTransition.setDuration(10);
+        resetListener();
+        startTransition(R.layout.scene4);
+        // The transition has all the asserts in it, so we can just end it now.
+        endTransition();
+    }
+
+    public void testMatchOrder() throws Throwable {
+        mTransition = new ChangeBounds();
+        resetListener();
+        enterScene(R.layout.scene1);
+        startTransition(R.layout.scene8);
+
+        // scene 8 swaps the ids, but not the names. No transition should happen.
+        waitForEnd(0);
+
+        // now change the match order to prefer the id
+        mTransition.setMatchOrder(new int[] {Transition.MATCH_ID, Transition.MATCH_NAME});
+
+        resetListener();
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount());
+        waitForEnd(400);
+    }
+
     private class NotRequiredTransition extends TestTransition {
         @Override
         public boolean isTransitionRequired(TransitionValues startValues,
@@ -243,5 +522,59 @@
             return false;
         }
     }
+
+    private class CaptureAnimatorTransition extends TestTransition {
+        public HashMap<View, Animator> animators = new HashMap<>();
+        public HashMap<View, AnimationStartListener> listeners = new HashMap<>();
+
+        @Override
+        public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            return setupAnimator(super.onAppear(sceneRoot, view, startValues, endValues),
+                    endValues.view);
+        }
+
+        @Override
+        public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            return setupAnimator(super.onDisappear(sceneRoot, view, startValues, endValues),
+                    startValues.view);
+        }
+
+        private Animator setupAnimator(Animator animator, View view) {
+            animators.put(view, animator);
+            AnimationStartListener listener = new AnimationStartListener();
+            animator.addListener(listener);
+            listeners.put(view, listener);
+            return animator;
+        }
+    }
+
+    private class CheckTransitionValuesTransition extends TestTransition {
+        @Override
+        public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            assertNull(getTransitionValues(endValues.view, true));
+            assertEquals(endValues, getTransitionValues(endValues.view, false));
+            return super.onAppear(sceneRoot, view, startValues, endValues);
+        }
+
+        @Override
+        public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                TransitionValues endValues) {
+            assertNull(getTransitionValues(startValues.view, false));
+            assertEquals(startValues, getTransitionValues(startValues.view, true));
+            return super.onDisappear(sceneRoot, view, startValues, endValues);
+        }
+    }
+
+    private class AnimationStartListener extends AnimatorListenerAdapter {
+        public CountDownLatch startLatch = new CountDownLatch(1);
+
+        @Override
+        public void onAnimationStart(Animator animation) {
+            startLatch.countDown();
+        }
+    }
 }
 
diff --git a/tests/tests/transition/src/android/transition/cts/VisibilityTest.java b/tests/tests/transition/src/android/transition/cts/VisibilityTest.java
new file mode 100644
index 0000000..091b229
--- /dev/null
+++ b/tests/tests/transition/src/android/transition/cts/VisibilityTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2016 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.transition.cts;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.transition.TransitionValues;
+import android.transition.Visibility;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+
+public class VisibilityTest extends BaseTransitionTest {
+    Visibility mVisibilityTransition;
+
+    public VisibilityTest() {
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mVisibilityTransition = (Visibility) mTransition;
+    }
+
+    public void testMode() throws Throwable {
+        assertEquals(Visibility.MODE_IN | Visibility.MODE_OUT, mVisibilityTransition.getMode());
+
+        // Should animate in and out
+        startTransition(R.layout.scene4);
+        assertEquals(1, mListener.endLatch.getCount());
+        endTransition();
+        waitForEnd(100);
+
+        resetListener();
+        mVisibilityTransition.setMode(Visibility.MODE_IN);
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount());
+        endTransition();
+        waitForEnd(100);
+
+        resetListener();
+        mVisibilityTransition.setMode(Visibility.MODE_OUT); // now it shouldn't do any animation
+        startTransition(R.layout.scene1);
+        waitForEnd(0);
+
+        // but it should animate out
+        resetListener();
+        startTransition(R.layout.scene4);
+        assertEquals(1, mListener.endLatch.getCount());
+        endTransition();
+        waitForEnd(100);
+
+        // switch the mode to only animate in
+        resetListener();
+        mVisibilityTransition.setMode(Visibility.MODE_IN);
+        startTransition(R.layout.scene1);
+        assertEquals(1, mListener.endLatch.getCount());
+        endTransition();
+        waitForEnd(100);
+
+        // but it shouldn't animate out
+        startTransition(R.layout.scene1);
+        waitForEnd(0);
+    }
+
+    public void testIsVisible() throws Throwable {
+        assertFalse(mVisibilityTransition.isVisible(null));
+
+        enterScene(R.layout.scene1);
+        final View redSquare = mActivity.findViewById(R.id.redSquare);
+        TransitionValues visibleValues = new TransitionValues();
+        visibleValues.view = redSquare;
+        mTransition.captureStartValues(visibleValues);
+
+        assertTrue(mVisibilityTransition.isVisible(visibleValues));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                redSquare.setVisibility(View.INVISIBLE);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        TransitionValues invisibleValues = new TransitionValues();
+        invisibleValues.view = redSquare;
+        mTransition.captureStartValues(invisibleValues);
+        assertFalse(mVisibilityTransition.isVisible(invisibleValues));
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                redSquare.setVisibility(View.GONE);
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        TransitionValues goneValues = new TransitionValues();
+        goneValues.view = redSquare;
+        mTransition.captureStartValues(goneValues);
+        assertFalse(mVisibilityTransition.isVisible(goneValues));
+    }
+}
+
diff --git a/tools/tradefed-host/res/config/cts.xml b/tools/tradefed-host/res/config/cts.xml
index 794605c..e08ad81 100644
--- a/tools/tradefed-host/res/config/cts.xml
+++ b/tools/tradefed-host/res/config/cts.xml
@@ -20,7 +20,9 @@
     <build_provider class="com.android.cts.tradefed.build.CtsBuildProvider" />
     <device_recovery class="com.android.tradefed.device.WaitDeviceRecovery" />
     <test class="com.android.cts.tradefed.testtype.CtsTest" />
-    <logger class="com.android.tradefed.log.FileLogger" />
+    <logger class="com.android.tradefed.log.FileLogger">
+        <option name="log-level-display" value="WARN" />
+    </logger>
     <result_reporter class="com.android.cts.tradefed.result.CtsXmlResultReporter" />
     <template-include name="reporters" default="basic-reporters" />
 </configuration>
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 9223bf4..9923fcd 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -118,17 +118,20 @@
     packages.sort()
 
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Exclude('android\.performance.*')
     self.__WritePlan(plan, 'CTS')
     self.__WritePlan(plan, 'CTS-TF')
 
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Exclude('android\.performance.*')
     plan.Exclude('android\.media\.cts\.StreamingMediaPlayerTest.*')
     # Test plan to not include media streaming tests
     self.__WritePlan(plan, 'CTS-No-Media-Stream')
 
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Exclude('android\.performance.*')
     self.__WritePlan(plan, 'SDK')
 
@@ -137,16 +140,19 @@
     self.__WritePlan(plan, 'Android')
 
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Include(r'android\.core\.tests.*')
     plan.Exclude(r'android\.core\.tests\.libcore\.package\.harmony*')
     self.__WritePlan(plan, 'Java')
 
     # TODO: remove this once the tests are fixed and merged into Java plan above.
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Include(r'android\.core\.tests\.libcore\.package\.harmony*')
     self.__WritePlan(plan, 'Harmony')
 
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Include(r'android\.core\.vm-tests-tf')
     self.__WritePlan(plan, 'VM-TF')
 
@@ -168,6 +174,7 @@
     plan.Include('android\.telephony')
     plan.Include('android\.nativemedia.*')
     plan.Include('com\.android\.cts\..*')#TODO(stuartscott): Should PDK have all these?
+    plan.Exclude('android\.car.*')
     self.__WritePlan(plan, 'PDK')
 
     temporarily_known_failure_tests = BuildCtsTemporarilyKnownFailureList();
@@ -176,6 +183,7 @@
 
     # CTS Stable plan
     plan = tools.TestPlan(packages)
+    plan.Exclude('android\.car.*')
     plan.Exclude(r'android\.browser')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
@@ -190,6 +198,7 @@
     for package, test_list in flaky_tests.iteritems():
       plan.Include(package+'$')
       plan.IncludeTests(package, test_list)
+    plan.Exclude('android\.car.*')
     self.__WritePlan(plan, 'CTS-flaky')
 
     small_tests = BuildAospSmallSizeTestList()
@@ -202,6 +211,7 @@
     for package, test_list in small_tests.iteritems():
       plan.Include(package+'$')
     plan.Exclude(r'android\.browser')
+    plan.Exclude('android\.car.*')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
     for package, test_list in releasekey_tests.iteritems():
@@ -219,6 +229,7 @@
       plan.ExcludeTests(package, test_list)
     for package, test_list in releasekey_tests.iteritems():
       plan.ExcludeTests(package, test_list)
+    plan.Exclude('android\.car.*')
     self.__WritePlan(plan, 'CTS-kitkat-medium')
     self.__WritePlan(plan, 'CTS-public-medium')
 
@@ -315,6 +326,7 @@
     plan.Exclude(r'android\.view$')
     plan.Exclude(r'android\.mediastress$')
     plan.Exclude(r'android\.browser')
+    plan.Exclude('android\.car.*')
     for package, test_list in flaky_tests.iteritems():
       plan.ExcludeTests(package, test_list)
     for package, test_list in releasekey_tests.iteritems():