Tests for add/remove targets on Transition.

Bug 21667680

Change-Id: Ica6190638081a37ac89c6bcc4aa5e6a4631c29f6
diff --git a/tests/tests/transition/res/layout/scene1.xml b/tests/tests/transition/res/layout/scene1.xml
index 4ed5b03..140bb8d 100644
--- a/tests/tests/transition/res/layout/scene1.xml
+++ b/tests/tests/transition/res/layout/scene1.xml
@@ -16,14 +16,23 @@
 
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="match_parent"
-                android:layout_height="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/redSquare" />
     <View android:layout_width="10dp"
           android:layout_height="10dp"
           android:background="#0F0"
+          android:transitionName="green"
           android:id="@+id/greenSquare"
           android:layout_below="@+id/redSquare" />
+    <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/scene2.xml b/tests/tests/transition/res/layout/scene2.xml
index 2033c95..541ec04 100644
--- a/tests/tests/transition/res/layout/scene2.xml
+++ b/tests/tests/transition/res/layout/scene2.xml
@@ -16,14 +16,22 @@
 
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="match_parent"
-                android:layout_height="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" />
     <View android:layout_width="10dp"
           android:layout_height="10dp"
           android:background="#F00"
+          android:transitionName="red"
           android:id="@+id/redSquare"
           android:layout_below="@+id/greenSquare" />
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:text="@string/world"
+              android:id="@+id/world"/>
 </RelativeLayout>
diff --git a/tests/tests/transition/res/layout/scene3.xml b/tests/tests/transition/res/layout/scene3.xml
index b0625aa..01fb78d 100644
--- a/tests/tests/transition/res/layout/scene3.xml
+++ b/tests/tests/transition/res/layout/scene3.xml
@@ -16,7 +16,8 @@
 
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent">
+                android:layout_height="match_parent"
+                android:id="@+id/holder">
     <View android:layout_width="10dp"
           android:layout_height="10dp"
           android:background="#0F0"
diff --git a/tests/tests/transition/res/layout/scene4.xml b/tests/tests/transition/res/layout/scene4.xml
new file mode 100644
index 0000000..1f1b7d6
--- /dev/null
+++ b/tests/tests/transition/res/layout/scene4.xml
@@ -0,0 +1,21 @@
+<?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"/>
diff --git a/tests/tests/transition/res/values/strings.xml b/tests/tests/transition/res/values/strings.xml
index 579da74..d9cf8c7 100644
--- a/tests/tests/transition/res/values/strings.xml
+++ b/tests/tests/transition/res/values/strings.xml
@@ -15,4 +15,6 @@
 -->
 <resources>
     <string name="add_button">Add Button</string>
+    <string name="hello">Hello</string>
+    <string name="world">World</string>
 </resources>
diff --git a/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
index 4bbfc2c..1537da3 100644
--- a/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
+++ b/tests/tests/transition/src/android/transition/cts/BaseTransitionTest.java
@@ -107,6 +107,17 @@
         });
     }
 
+    protected void enterScene(final int layoutId) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Scene scene = Scene.getSceneForLayout(mSceneRoot, layoutId, mActivity);
+                scene.enter();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+    }
+
     public class TestTransition extends Visibility {
         public final SimpleTransitionListener listener = new SimpleTransitionListener();
 
diff --git a/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java b/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java
index 4d18bbfb..113f5a5 100644
--- a/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java
+++ b/tests/tests/transition/src/android/transition/cts/SimpleTransitionListener.java
@@ -22,6 +22,7 @@
  * Listener captures whether each of the methods is called.
  */
 class SimpleTransitionListener implements TransitionListener {
+    public Transition transition;
 
     public boolean started;
 
@@ -36,6 +37,7 @@
     @Override
     public synchronized void onTransitionStart(Transition transition) {
         started = true;
+        this.transition = transition;
         notifyAll();
     }
 
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java b/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java
index 5d16b19..78db908 100644
--- a/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java
+++ b/tests/tests/transition/src/android/transition/cts/TransitionManagerTest.java
@@ -20,7 +20,6 @@
 import android.transition.Scene;
 import android.transition.TransitionManager;
 import android.view.View;
-import android.widget.FrameLayout;
 
 public class TransitionManagerTest extends BaseTransitionTest {
 
@@ -43,6 +42,9 @@
         assertFalse(mTransition.listener.resumed);
         assertFalse(mTransition.listener.paused);
         assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -60,6 +62,9 @@
         assertFalse(mTransition.listener.resumed);
         assertFalse(mTransition.listener.paused);
         assertFalse(mTransition.listener.canceled);
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -86,7 +91,9 @@
         assertFalse(mTransition.listener.resumed);
         assertFalse(mTransition.listener.paused);
         assertFalse(mTransition.listener.canceled);
-
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -132,7 +139,9 @@
         assertFalse(mTransition.listener.resumed);
         assertFalse(mTransition.listener.paused);
         assertFalse(mTransition.listener.canceled);
-
+        assertNotNull(mTransition.listener.transition);
+        assertEquals(TestTransition.class, mTransition.listener.transition.getClass());
+        assertTrue(mTransition != mTransition.listener.transition);
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionTest.java b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
index 6ecf8a4..340d557 100644
--- a/tests/tests/transition/src/android/transition/cts/TransitionTest.java
+++ b/tests/tests/transition/src/android/transition/cts/TransitionTest.java
@@ -17,9 +17,16 @@
 
 import com.android.cts.transition.R;
 
+import android.animation.ObjectAnimator;
 import android.transition.AutoTransition;
 import android.transition.Scene;
 import android.transition.TransitionManager;
+import android.transition.TransitionValues;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 public class TransitionTest extends BaseTransitionTest {
 
@@ -28,11 +35,9 @@
 
     public void testAddListener() throws Throwable {
         startTransition(R.layout.scene1);
-
         waitForStart();
 
         final SimpleTransitionListener listener2 = new SimpleTransitionListener();
-        mTransition.addListener(listener2);
 
         runTestOnUiThread(new Runnable() {
             @Override
@@ -50,13 +55,13 @@
         assertTrue(mTransition.listener.paused);
         assertTrue(mTransition.listener.resumed);
         assertFalse(mTransition.listener.canceled);
-        assertTrue(mTransition.listener.ended);
+        assertFalse(mTransition.listener.ended);
         assertTrue(mTransition.listener.started);
 
-        assertTrue(listener2.paused);
-        assertTrue(listener2.resumed);
+        assertFalse(listener2.paused);
+        assertFalse(listener2.resumed);
         assertFalse(listener2.canceled);
-        assertTrue(listener2.ended);
+        assertFalse(listener2.ended);
         assertTrue(listener2.started);
         endTransition();
     }
@@ -75,5 +80,144 @@
         Thread.sleep(150);
         assertFalse(mTransition.listener.ended);
     }
+
+    public void testAddTargetId() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(R.id.holder);
+        mTransition.addTarget(R.id.hello);
+        assertEquals(2, mTransition.getTargetIds().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.hello, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testRemoveTargetId() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(R.id.holder);
+        mTransition.addTarget(R.id.hello);
+        mTransition.addTarget(R.id.redSquare);
+        assertEquals(3, mTransition.getTargetIds().size());
+        mTransition.removeTarget(0); // nothing should happen
+        mTransition.removeTarget(R.id.redSquare);
+        assertEquals(2, mTransition.getTargetIds().size());
+
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.hello, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testAddTargetClass() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(RelativeLayout.class);
+        mTransition.addTarget(TextView.class);
+        assertEquals(2, mTransition.getTargetTypes().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertTrue(mTargets.get(0) instanceof TextView);
+        endTransition();
+    }
+
+    public void testRemoveTargetClass() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget(TextView.class);
+        mTransition.addTarget(View.class);
+        mTransition.addTarget(RelativeLayout.class);
+        assertEquals(3, mTransition.getTargetTypes().size());
+        mTransition.removeTarget(ImageView.class); // should do nothing
+        mTransition.removeTarget(View.class);
+        assertEquals(2, mTransition.getTargetTypes().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertTrue(mTargets.get(0) instanceof TextView);
+        endTransition();
+    }
+
+    public void testAddTargetView() throws Throwable {
+        enterScene(R.layout.scene1);
+
+        final View[] target = new View[1];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                target[0] = mActivity.findViewById(R.id.hello);
+            }
+        });
+        mTransition.addTarget(target[0]);
+        assertEquals(1, mTransition.getTargets().size());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                target[0].setVisibility(View.GONE);
+            }
+        });
+        waitForStart();
+        assertEquals(1, mTargets.size());
+        assertEquals(target[0], mTargets.get(0));
+        endTransition();
+    }
+
+    public void testRemoveTargetView() throws Throwable {
+        enterScene(R.layout.scene1);
+
+        final View[] target = new View[3];
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                target[0] = mActivity.findViewById(R.id.hello);
+                target[1] = mActivity.findViewById(R.id.greenSquare);
+                target[2] = mActivity.findViewById(R.id.redSquare);
+            }
+        });
+
+        mTransition.addTarget(target[0]);
+        mTransition.addTarget(target[1]);
+        assertEquals(2, mTransition.getTargets().size());
+        mTransition.removeTarget(target[2]); // should do nothing
+        mTransition.removeTarget(target[1]);
+        assertEquals(1, mTransition.getTargets().size());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                TransitionManager.beginDelayedTransition(mSceneRoot, mTransition);
+                target[0].setVisibility(View.GONE);
+            }
+        });
+        waitForStart();
+        assertEquals(1, mTargets.size());
+        assertEquals(target[0], mTargets.get(0));
+        endTransition();
+    }
+
+    public void testAddTargetName() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget("red");
+        mTransition.addTarget("holder");
+        assertEquals(2, mTransition.getTargetNames().size());
+        assertEquals(0, mTargets.size());
+        startTransition(R.layout.scene2);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.redSquare, mTargets.get(0).getId());
+        endTransition();
+    }
+
+    public void testRemoveTargetName() throws Throwable {
+        enterScene(R.layout.scene4);
+        mTransition.addTarget("holder");
+        mTransition.addTarget("red");
+        mTransition.addTarget("green");
+        assertEquals(3, mTransition.getTargetNames().size());
+        mTransition.removeTarget("purple"); // should do nothing
+        // try to force a different String instance
+        String greenName = new StringBuilder("gre").append("en").toString();
+        mTransition.removeTarget(greenName);
+        assertEquals(2, mTransition.getTargetNames().size());
+        startTransition(R.layout.scene1);
+        assertEquals(1, mTargets.size());
+        assertEquals(R.id.redSquare, mTargets.get(0).getId());
+        endTransition();
+    }
 }